Tags: ast python reversing

Rating:

For this challenge, you are given a single Python AST/CST file.

The first task is to convert it to Python code. Luckily, the file is a [LibCST](https://libcst.readthedocs.io/), not an [AST](https://docs.python.org/3/library/ast.html), so we can convert it byte for byte into code.

We get this code:

import binascii

plaintext = "REDACTED"

def exor(a, b):
temp = ""
for i in range(n):
if (a[i] == b[i]):
temp += "0"
else:
temp += "1"
return temp

def BinaryToDecimal(binary):
string = int(binary, 2)
return string

# encryption
PT_Ascii = [ord(x) for x in plaintext]

PT_Bin = [format(y, '08b') for y in PT_Ascii]
PT_Bin = "".join(PT_Bin)

n = 26936
K1 = ... # length n string of 0s and 1s
K2 = ... # length n string of 0s and 1s

L1 = PT_Bin[0:n]
R1 = PT_Bin[n::]

f1 = exor(R1, K1)
R2 = exor(f1, L1)
L2 = R1

f2 = exor(R2, K2)
R3 = exor(f2, L2)
L3 = R2

R3 = ... # length n string of 0s and 1s
L3 = ... # length n string of 0s and 1s

cipher = L3+R3

# decryption (redacted)
plaintext = L6+R6
plaintext = int(plaintext, 2)
plaintext = binascii.unhexlify('%x' % plaintext)
print(plaintext)


We are given K1, K2, L3, and R3, and we have to find L1 and R1. Then, we can concatenate L1 and R1, convert it to ASCII, and retrieve the flag.

exor is the classical XOR operation, so we can use the fact that (a ^ b) ^ c == a ^ (b ^ c), to figure out f1, f2, L2, R2.

For example,

R3 = f2 ^ L2
R3 = R2 ^ K2 ^ L2
R3 = R2 ^ K2 ^ R1
R3 = L3 ^ K2 ^ R1
R1 = L3 ^ K2 ^ R3


We can use a similar method to reverse L1.

**Flag:** 3k{almost_done_shizzle_up_my_nizzle}