본문 바로가기

Game/FTZ

level 16

level16!

힌트를 보기위해 cat hint

소스를 보면 shell이라는 함수와,printit함수, main함수를 볼수 있다.

shell함수는 쉘을 띄워주는 함수이고, printit함수는 Hello there이라는 문자열을 프린트하는 함수다.


메인함수를 살펴보면 

carp이라는 변수를 생성하고, 

void (*call)() = printit;을 통해서 prtintit함수를 호출하고있다.


이 printit함수를 불러오는 부분을 shell()함수를 불러오도록 바꿔치기하면 shell을 띄울수 있을 것이다!

우선 메인에서 어느부분에 콜하는 함수의 주소가 들어가는지 보기위해 

tmp폴더를 만들고 attackme로 복사해 gdb로 내부를 확인해보았다.


disassemble main

main+6을 보면 ebp에서 16만큼 뺀 부분에 0x8048500이란 주소를 옮기고있는데 

저주소가 printit함수의 시작주소라고 생각되었다.

확인해보기 위해 disassemble printit

예상했던대로 함수의 시작주소가 일치한다.


그렇다면 ebp-16인 부분에 shell함수의 주소를 덮어씌우면 될것이다. 


shell함수의 시작주소를 확인해보기 위해 disassemble shell

shell함수의 시작주소는 0x080484d0가 되시겠다.


페이로드 : nop*40 + "\xd0\x84\x04\x08" + nop*12 + "bbbb"(ebp, 4byte )

그리고 인자를 받는 방식이 프로그램이 실행된 후에 받으므로 |을 이용해서 보내준다.

생각했던대로 쉘이 떴다! 

my-pass명령어로 level17의 password를 알아내고 다음레벨로 이동 ~.~

'Game > FTZ' 카테고리의 다른 글

level 19  (0) 2015.06.01
level 17  (0) 2015.05.29
level 15  (0) 2015.05.29
level 12  (0) 2015.05.28
level 14  (0) 2015.05.28