Rating:

# pyzzle

We are given a python Concrete Syntax Tree (CST). We can decrypt it using libcst library to get source.

py
from libcst import *

def reverse():
with open('pyzzle') as f:
tree = f.read()
cst = eval(tree)
with open('src.py', 'w') as f:
f.write(cst.code)


The plaintext is decrypted using a couple XORs on some numbers, we can easily decrypt them to get the plaintext.

py
K1 = int(K1, 2)
K2 = int(K2, 2)

R3 = int(R3, 2)
L3 = int(L3, 2)

L = K2 ^ R3 ^ K1
R = L ^ L3 ^ K1

plaintext = binascii.unhexlify('%x' % ((L << n) | R))
plaintext = binascii.unhexlify(plaintext).decode()

with open('graph', 'w') as f:
f.write(plaintext)


The plaintext has our first flag.

txt
3k{almost_done_shizzle_up_my_nizzle}


The text describes a graph, with 2d coordinates as vertices, and some edges between them.
Format the vertices and edges in good format, on some editor.
There is an awesome geometry visualization library in C++ [geodeb](https://github.com/lukakalinovcic/geodeb) we can use.

cpp
#include<bits/stdc++.h>
#include "geodeb.h"

using namespace std;

vector<array<int, 2>> edges = {{1, 2}, {2, 3}, /* ... */ {141, 143}, {143, 144}};
vector<array<int, 2>> coord = {{5,5}, {55,5}, /* ... */ {1845,105}};
int main() {
GD_INIT("points.html");
// flipped y axis
for (auto &x : coord) {
x = 150 - x;
}
for (auto &e : edges) {
e--, e--;
}
for (auto [u, v] : edges) {
GD_SEGMENT(coord[u], coord[u], coord[v], coord[v]);
}
}


Open the [points.html](https://github.com/goswami-rahul/ctf/blob/master/3kCTF2020/pyzzle/points.html) in browser to see the second flag.

txt
3k{PYZZLE_FO_SHIZZLE_MY_NIZZLE}


Original writeup (https://github.com/goswami-rahul/ctf/tree/master/3kCTF2020/pyzzle).