1. 개념
eggshell란 ? stack내 shell code 저장 불가 시 (or etc), 환경변수 내 shell code 저장 후, 환경변수의 주소 값으로 eip를 이동시켜 shell code 실행하는 기법
2. 문제풀이
1. CODE
/* The Lord of the BOF : The Fellowship of the BOF - orc - egghunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("stack is still your friend.\n"); exit(0); } strcpy(buffer, argv[1]); printf("%s\n", buffer); } |
2. Solution
1) Code Review
[1] environ[i] 0 값 세팅 이유 <- eggshell 기법
[2] argv[1][47] == '\xbf'
assembly 파악
(gdb) disas main ... 0x8048587 <main+135>: mov 0xc(%ebp),%eax 0x804858a <main+138>: add $0x4,%eax 0x804858d <main+141>: mov (%eax),%edx 0x804858f <main+143>: add $0x2f,%edx 0x8048592 <main+146>: cmpb $0xbf,(%edx) ... |
mov 0xc(%ebp), %eax |
%ebp
0
---$ebp 시작
return address
argc
*argv[] (인자의 값을 가리키는 주소들을 가리키는 값)
100
--> 0xc(%ebp) = 인자의 값을 가리키는 주소 = %eax
add $0x4, %eax |
%eax = 실행프로그램명을 가리키는 주소
%eax+4 = 인자 값을 가리키는 주소
mov (%eax), %edx |
인자 값을 %edx에 넣어준다
add $0x2f, %edx |
인자 문자열에서 48번째 byte의 주소를 edx에 넣어준다.
cmpl $0xbf, (%edx) |
0xbf 값과 %edx 값 비교 -> 인자 문자열+48번째 바이트와 0xbf를 비교
[3] strcpy() 문자열 길이 NO CHECK
1. return address 주소
CALL main 후 stack 값 확인
2. buffer 주소
strcpy() 이후 stack 값 확인
3. SHELL CODE 작성
스택 주소 변경을 감안하여 nop코드 추가
'HACKING_GAME > SYSTEM' 카테고리의 다른 글
LOB#1 gate (0) | 2020.07.19 |
---|---|
PWNABLE#7 input (0) | 2020.05.14 |
LOB#6 check length of argv[1] + egghunter + bufferhunter (wolfman -> darkelf) (0) | 2020.05.10 |
PWNABLE#3 bof (0) | 2020.04.26 |
LOB#2 small buffer (gremlin -> cobolt) (0) | 2020.04.26 |