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를 알아내고 다음레벨로 이동 ~.~