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

+ Recent posts