import base58 import struct def cubicRoot(n) : start = 0 end = n e = 0.00000001 while (True) : mid = (start + end) / 2 error = abs(n - (mid * mid * mid)) if (error <= e) : return mid if ((mid * mid * mid) > n) : end = mid else : start = mid def find_cube_root(n): lo = 0 hi = 1 << ((n.bit_length() + 2) // 3) while lo < hi: mid = (lo+hi) >> 1 if mid**3 < n: lo = mid+1 else: hi = mid return lo STANDARD_ALPHABET = b'123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' CUSTOM_ALPHABET = b'9876432*Flag{n0T-EA5y=to+f1Nd}BCDGHJKLMPQRSUVWXYZbcehijkmp' with open("./enc.dat.bak", "rb") as f: buf = f.read() encrypted, key = buf.split(b"FLAG") key = base58.b58decode(key.translate(bytes.maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET))) print("Key: " + int(find_cube_root(int.from_bytes(key, "big"))).to_bytes(8, "big").decode()) # Key: N5f0cuS_ with open("./sbox.bin", "rb") as f: buf = f.read() it = struct.iter_unpack(">24)&0xff)]; x = sbox[0x112 + ((z>>16)&0xff)] + x; x = sbox[0x212 + ((z>> 8)&0xff)] ^ x; x = sbox[0x312 + ((z>> 0)&0xff)] + x; x = y ^ x y = z x = x ^ sbox[1] y = y ^ sbox[0] return (x, y) def byteswap32(a): return (a >> 8) & 0xFF00 | (a << 8) & 0xFF0000 | (a << 24) & 0xFF000000 | (a >> 24) & 0xFF it = struct.iter_unpack("