level16의 ID와 PW는 아래와 같습니다.
ID : level16
PW : about to cause mass
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
hint 파일을 살펴보면 다음과 같습니다.
[그림 1] level16 hint파일
힌트파일에서 attackme의 소스를 [그림 1]과 같이 보여주고 있습니다.
이 소스를 요약하면 다음과 같은 특징을 가집니다.
01. int 형으로 crap선언
02. *call에 printit이라는 함수의 주소를 저장
03. char형으로 버퍼 20byte 선언
04. 버퍼를 48byte 읽음
05. call 함수를 불러들임
06. shell이라는 함수에서 다음 권한으로 /bin/sh이 실행됨
우리는 먼저 fgets()함수로 불러오는 부분의 메모리를 살펴보고, call()이 왜 불러지는지를 살펴봐야 할 것 같습니다.
attackme를 atm으로 카피하여 분석해봅시다.
[그림 2] atm 파일을 gdb로 열어본 모습
main+39를 보니 call() 함수의 주소를 적어놓는 것 같습니다.
call()에는 printit()이라는 함수의 주소가 들어가 있습니다.
그리고, eax에 저장된 함수의 주소는 main+6를 보니 ebp에서 -0x10 떨어진 곳에 call() 함수의 주소를 저장하는 것 같습니다.
eax에 shell()이라는 함수의 주소를 적어주면 printit()이라는 함수 대신 shell()이 실행될 것입니다.
그럼 우리는 shell()함수의 주소를 확인할 필요가 있습니다.
[그림 3] shell함수의 실행주소 및 실행코드
shell() 함수의 주소는 0x080484d0입니다.
이제 eax에다가 저장하면 될 것 같습니다.
현재 eax에는 printit의 함수 주소, 0x8048500이 들어 있을 것입니다.
[그림 4] printit() 함수가 ebp-0x10에 있는 모습
ebp의 주소는 0xbfffde68로 0xbfffde88이라는 값을 가지고 있습니다.
그리고 ebp-0x10에는 printit()함수의 주소가 들어가 있는 것을 확인할 수 있습니다.
[그림 5] A*40개 + B*4개로 확인한 위치
A 40개와 B 4개를 입력하여 위치를 확인해보면 [그림 5]와 같은 상태를 확인할 수 있습니다.
즉, 40Byte의 더미값과 4Byte의 shell()함수의 주소를 넣어 shell()함수를 실행시키면 될 것 같습니다.
입력위치(/home/level15)
코드 : (python -c 'print "A"*40 + "\xd0\x84\x04\x08"';cat)| ./attackme
[그림 6] 문제 해결
'WARGAMES > FTZ' 카테고리의 다른 글
level15_FTZ_SIMPLE BOF기법 (0) | 2016.08.24 |
---|---|
level14_FTZ_SIMPLE BOF기법 (0) | 2016.08.10 |
level13_FTZ_RTL기법 (0) | 2016.08.08 |
level12_FTZ_RTL기법 (0) | 2016.08.07 |
level11_FTZ_RTL기법 (0) | 2016.07.21 |
level10_FTZ (0) | 2016.07.21 |
level09_FTZ (0) | 2016.07.21 |
level08_FTZ (0) | 2016.01.07 |