diff --git a/alpacahack/daily/useful-machine/dissassemble.py b/alpacahack/daily/useful-machine/dissassemble.py new file mode 100644 --- /dev/null +++ b/alpacahack/daily/useful-machine/dissassemble.py @@ -0,0 +1,27 @@ +import sys + +filename = sys.argv[1] + +with open(filename, "rb") as f: + code = f.read() + +ops = { + 0: "INPUT ", + 1: "MOV_IMM ", + 2: "MOV_MEM ", + 3: "ADD ", + 4: "MUL ", + 5: "XOR ", + 6: "NOT " +} + +for i in range(0, len(code), 3): + if i + 2 >= len(code): + break + op = code[i] + o1 = code[i+1] + o2 = code[i+2] + + op_name = ops.get(op, f"UNKNOWN({op})") + print(f"{i:04x}: {op_name} mem[{o1:02x}], { + o2:02x} (mem[{o2:02x}] if mem op)") diff --git a/alpacahack/daily/useful-machine/solve.py b/alpacahack/daily/useful-machine/solve.py new file mode 100644 --- /dev/null +++ b/alpacahack/daily/useful-machine/solve.py @@ -0,0 +1,21 @@ +constants = [ + (0x09, 0xb8), (0xda, 0x92), (0xf0, 0xd2), (0xda, 0xab), (0xc1, 0x87), + (0xee, 0xcc), (0xa9, 0xfa), (0xca, 0x7a), (0xba, 0xbf), (0xd0, 0x9b), + (0xc3, 0xe7), (0x89, 0xfe), (0x8d, 0x16), (0x80, 0x23), (0x80, 0x44), + (0x5a, 0xad), (0xa1, 0xeb), (0xc7, 0x42), (0x45, 0x9a), (0xf9, 0xc4), + (0xd2, 0x87), (0xa2, 0x83), (0xf2, 0xd2), (0x43, 0x39), (0x03, 0xcd), + (0x4f, 0x16), (0xc8, 0x6a), (0x5a, 0xaf), (0x98, 0xd6), (0x52, 0x3c), + (0xb7, 0x6c), (0xfd, 0xe4), (0xaa, 0x29), (0xe7, 0x23), (0xc6, 0x7d), + (0xe2, 0xf2), (0x84, 0x08), (0x70, 0xd3), (0x2b, 0x75), (0xeb, 0x1d) +] + +flag = "" +prev_p = 0 + +for k1, k2 in constants: + curr_p = (-k2) % 256 + char_code = ((curr_p ^ k1) - prev_p) % 256 + flag += chr(char_code) + prev_p = curr_p + +print(flag)