buffer의 크기는 1024
코드 중간에 i가 0x1234567이 아니면 프로세스가 종료됩니다.
i의 값을 그대로 두고 ret를 바꾸면 되겠습니다.
gdb로 attackme를 열어봅니다.
Stack을 1048(0x418)만큼 확보합니다.
i를 0x1234567로 초기화 하는 부분도 보입니다.
i와 buf 사이의 거리를 알아보기 위해 Brute Force를 해봅니다.
1036부터 터지는것을 확인할 수 있습니다.
BOF 이후에도 i가 손상되지 않도록 i값을 넣어줘 봅니다.
정상적으로 종료되는 것을 확인할 수 있습니다.
위에서 stack을 1048만큼 확보하는 것을 확인했으므로 이제 ret만 조작하면 됩니다.
Stack 구조
Low addr
buf (1024-byte)
|
garbage (12-byte)
|
i = 0x1234567 (4-byte) |
garbage (8-byte) |
sfp (4-byte)
|
ret (4-byte)
|
High addr
nop slide와 shell code로 1036-byte를 만들고 i 뒤에서 ret를 덮어씌우면 되겠습니다.
return 할 주소를 찾기위해 buf에 접근하는 strcpy 주변을 찾아봅니다.
0xbffff2f0부터 buf가 시작됩니다.
공격해봅니다.
level14의 shell이 떨어졌습니다.