힌트를 보면 Fake EBP라고 합니다.
코드를 보면 ret가 0xbf나 0x40으로 시작하면
오류 메시지를 출력하고 종료됩니다.
buffer에 값을 복사할때도 strcpy 대신 strncpy를 사용합니다.
조작 가능한 영역은 sfp와 ret 뿐입니다.
Fake EBP에 대한 개념을 모르시면 다음 글을 읽고 오세요.
->
gdb로 열어봅니다.

Stack을 0x28(40)만큼 확보합니다.
buffer로 ebp를 돌려야하므로 buffer 시작 주소를 찾아야합니다.
buffer의 주소를 찾기 위해 buffer에 접근하는 strncpy() 주변을 살펴봅니다.


0xbffffab0부터 buffer가 시작됩니다.
FEBP를 위한 leave와 ret가 있는 주소를 찾아봅니다.

0x080484df에 있습니다.
system()을 통해 /bin/sh를 실행하겠습니다.

system()의 주소는 0x40058ae0 입니다.
이제 libc.so.6 내부의 "/bin/sh"의 주소를 찾아야합니다.
전에 만들었던 프로그램을 돌려줍니다.

"/bin/sh"의 주소는 0x400fbff9입니다.
sfp를 buffer 주소보다 4 작은 주소로 바꾸고
ret를 leave로 돌아가게 만들고
buffer에는 system()을 실행하도록
값을 저장하면 됩니다.
Stack 구조
Low addr
ret (to system) |
ret (4-byte)
|
&"/bin/sh" (4-byte) |
"A"x28 (28-byte) |
sfp (to buffer-4) |
ret (to leave)
|
High addr
공격해봅니다.

공격에 성공했습니다.