diff --git a/code-guessing/base32-ts.py b/code-guessing/base32-ts.py new file mode 100755 index 0000000..1c78996 --- /dev/null +++ b/code-guessing/base32-ts.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +import random +import collections +import subprocess +import ctypes +import tempfile +import os +import shutil +import os.path +import base64 + +class CWrapper: + def __init__(self, file): + self.filename = file + def __enter__(self): + self.tempfile = tempfile.mktemp(prefix="shlib-") + print("Compiling C file", self.filename) + if subprocess.run(["gcc", self.filename, "-o", self.tempfile , "-shared", "-fPIC"]).returncode != 0: + raise ValueError("compilation failed") + library = ctypes.CDLL(self.tempfile) + self.function = entry = library.entry + entry.restype = ctypes.c_char_p + return self + + def __call__(self, s): return self.function(ctypes.c_char_p(s.encode("ascii"))).decode("ascii") + def __repr__(self): return f"" + def __exit__(self, type, value, traceback): os.unlink(self.tempfile) + +class JavaWrapper: + main = """ +import java.io.*; +public class Main { + public static void main(String[] args) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + try { + while (true) { + String line = br.readLine(); + if (line == null) { return; } + System.err.println("got"); + System.err.println(line); + System.out.println(Entry.entry(line)); + } + } catch (IOException ioe) { + System.err.println(ioe); + System.exit(1); + } + } +} + """ + + def __init__(self, file): + self.filename = file + def __enter__(self): + self.tempdir = tempfile.mkdtemp(prefix="javacompile-") + code_path = os.path.join(self.tempdir, "Entry.java") + shutil.copyfile(self.filename, code_path) + main_path = os.path.join(self.tempdir, "Main.java") + with open(main_path, "w") as f: + f.write(JavaWrapper.main) + print("Compiling Java file", self.filename) + if subprocess.run(["javac", code_path, main_path]).returncode != 0: + raise ValueError("compilation failed") + main_class_path = os.path.join(self.tempdir, "Main.class") + self.process = subprocess.Popen(["java", "-cp", self.tempdir, "Main"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) + return self + + def __call__(self, s): + self.process.stdin.write(s.encode("ascii") + os.linesep.encode("ascii")) + self.process.stdin.flush() + return self.process.stdout.readline().decode("ascii") + def __repr__(self): return f"" + def __exit__(self, type, value, traceback): + shutil.rmtree(self.tempdir) + self.process.kill() + +def test(entry): + for _ in range(500): + s = "".join(chr(random.randint(32, 126)) for _ in range(random.randint(1, 256))) + answer = base64.b32encode(s.encode("ascii")).decode("ascii") + result = entry(s) + assert answer == result, f"test failed for {entry}: got {result}, should be {answer}, for {s}" + print(entry, "passed all tests") + +import base32 +test(base32.entry) \ No newline at end of file diff --git a/code-guessing/base32.py b/code-guessing/base32.py new file mode 100644 index 0000000..873893a --- /dev/null +++ b/code-guessing/base32.py @@ -0,0 +1,22 @@ +import string, re + +def entry(argv): + argv = argv.encode("utf-8") + modulus = len(argv) % 5 + if modulus > 0: + argv += b"\x00" * (5-modulus) + chars = string.ascii_uppercase + "234567" + historyLen = 1 + + b = 0 + for c in reversed(argv): + b += c * historyLen + historyLen *= 256 + data = [] + while b != 0: + data.append(chars[b % 32]) + b //= 32 + data = "".join(reversed(data)) + + checksum = { 0: 0, 1: 6, 2: 4, 3: 3, 4: 1 } + return re.sub("A{%d}$" % checksum[modulus], lambda str: str.group(0).replace("A", "="), data) \ No newline at end of file diff --git a/image-ec.py b/image-ec.py new file mode 100644 index 0000000..9b0f123 --- /dev/null +++ b/image-ec.py @@ -0,0 +1,76 @@ +from PIL import Image +import enum +import random + +rng = random.Random() +def randomize(x, pos, m): + rng.seed(bytes(x) + pos[0].to_bytes(4, "little") + pos[1].to_bytes(4, "little"), 2) + return rng.randint(0, m), rng.randint(0, 255) + +class Command(enum.Enum): + DIV = 0 + DRP = 1 + SDIZ = 2 + MOD = 3 + READ_IN = 4 + ADD = 5 + PUSH = 6 + MUL = 7 + ROT = 8 + UNROT = 9 + DUP = 10 + CWROTATE = 11 + ACWROTATE = 12 + SETDIR = 13 + UNASSIGNED_1 = 14 + EXIT = 15 + OUT = 16 + SWP = 17 + NOP = 18 + +dirs = { "up": (0, -1), "down": (0, 1), "right": (1, 0), "left": (-1, 0), "downright": (1, 1), "upright": (1, -1), "up2": (0, -2), "upleft": (-1, -1), "up3": (0, -3) } +def setdir(d): + x, y = dirs[d] + x, y = x + 3, y + 3 + return (x << 3) + y + +def go(d): return Command.SETDIR, setdir(d) + +inp = [ + [ Command.ACWROTATE, Command.ROT, (Command.SETDIR, setdir("right")), (Command.SETDIR, setdir("down"))], + [ Command.NOP, (Command.PUSH, 32), Command.UNROT, Command.NOP ], + [ (Command.PUSH, 0) , Command.UNROT, Command.DUP, Command.MUL ], + [ (Command.PUSH, 1), Command.DRP, Command.ROT , Command.UNROT , go("down"), Command.NOP, (Command.SETDIR, setdir("left")) ], + [ (Command.SETDIR, setdir("right")), Command.READ_IN, Command.CWROTATE , Command.ADD, go("right"), (Command.PUSH, 128), Command.ADD, Command.MUL ], + [ go("down"), Command.EXIT, Command.NOP, Command.ROT, Command.NOP ], + [ Command.DUP, go("upleft") , Command.NOP, go("upright") ], + [ Command.UNROT, (Command.SDIZ, setdir("up2"))], + [ Command.DUP , Command.NOP ], + [ Command.ROT , Command.NOP], + [ Command.MOD , Command.NOP], + [ Command.OUT , Command.NOP ], + [ Command.DUP, Command.NOP ], + [ Command.UNROT, go("up") ], + [ Command.DIV, Command.SWP ], + [ go("right"), go("up") ], + [ None, go("up3") ] +] + +im = Image.new("RGB", (max(map(len, inp)), len(inp))) +px = im.load() +for y, row in enumerate(inp): + for x, op in enumerate(row): + if op: + param = None + if isinstance(op, tuple): + op, param = op + print(x, y, op, param) + # brute force muahahaha + command_id = op.value + while True: + rgb = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) + cmd, arg = randomize(rgb, (x, y), Command.NOP.value) + if cmd == command_id and (param is None or arg == param): + px[x, y] = rgb + break +im.save("/tmp/out.png") \ No newline at end of file diff --git a/image-eso.py b/image-eso.py new file mode 100644 index 0000000..d06ad21 --- /dev/null +++ b/image-eso.py @@ -0,0 +1,122 @@ +from PIL import Image +import random + +im = Image.open("/tmp/out.png") +px = im.load() + +rng = random.Random() +def randomize(x, pos, m): + rng.seed(bytes(x) + pos[0].to_bytes(4, "little") + pos[1].to_bytes(4, "little"), 2) + return rng.randint(0, m), rng.randint(0, 255) + +COMMANDS = 18 +size = im.size +position = (0, 0) +direction = (1, 0) +matrix_1 = ((0, 1), (-1, 0)) +matrix_2 = ((0, -1), (1, 0)) +def rotate(matrix): + global direction + a = direction[0] * matrix[0][0] + direction[1] * matrix[0][1] + b = direction[0] * matrix[1][0] + direction[1] * matrix[1][1] + direction = (a, b) +stack = [] +inbuf = ["b", "e", "e", "s", "i", "n", "c", "u", "r", "s", "e"] + +class Command(__import__("enum").Enum): + DRP = 1 + SDIZ = 2 + MOD = 3 + READ_IN = 4 + ADD = 5 + PUSH = 6 + MUL = 7 + ROT = 8 + UNROT = 9 + DUP = 10 + CWROTATE = 11 + ACWROTATE = 12 + SETDIR = 13 + EXIT = 15 + UNASSIGNED_1 = 14 + DIV = 0 + OUT = 16 + SWAP = 17 + NOP = 18 + +while True: + command, param = randomize(px[position], position, COMMANDS) + print(command, position, direction, stack, Command(command)) + if command == 4: + # read input + if len(inbuf) > 0: + stack.append(ord(inbuf.pop(0))) + else: + rotate(matrix_1) + elif command == 5: + # add + if len(stack) >= 2: + stack.append(stack.pop() + stack.pop()) + else: + rotate(matrix_2) + elif command == 3: + # mod + if len(stack) >= 2: + stack.append(stack.pop() % stack.pop()) + else: + rotate(matrix_2) + elif command == 0: + # div + if len(stack) >= 2: + stack.append(stack.pop() // stack.pop()) + else: + rotate(matrix_2) + elif command == 6: # push + stack.append(param) + elif command == 8: + # rot + if len(stack) > 0: + stack = [stack.pop()] + stack + elif command == 9: + # unrot + if len(stack) > 0: + stack.append(stack.pop(0)) + elif command == 10: + stack.extend([stack.pop()] * 2) + elif command == 7: + # mul + if len(stack) >= 2: + stack.append(stack.pop() * stack.pop()) + else: + rotate(matrix_2) + elif command == 11: + rotate(matrix_1) + elif command == 12: + rotate(matrix_2) + elif command == 13: # setdir + arg = param + lowbits = (arg & 0b111) - 3 + highbits = ((arg >> 3) & 0b111) - 3 + direction = highbits, lowbits + elif command == 2: # setdir if zero + if len(stack) > 0 and stack[-1] == 0: + arg = param + lowbits = (arg & 0b111) - 3 + highbits = ((arg >> 3) & 0b111) - 3 + direction = highbits, lowbits + elif command == 16: + inbuf.append(chr(stack.pop())) + elif command == 17: + if len(stack) >= 2: + a, b = stack.pop(), stack.pop() + stack.append(a) + stack.append(b) + elif command == 1: + if len(stack) > 0: stack.pop() + elif command == 15: + break + + position = (position[0] + direction[0], position[1] + direction[1]) + while position[0] < 0 or position[1] < 0 or position[0] >= size[0] or position[1] >= size[1]: + position = (position[0] % size[0], position[1] % size[1]) +print(stack, inbuf) \ No newline at end of file