# pyzzle
We are given a python Concrete Syntax Tree (CST). We can decrypt it using `libcst` library to get source.
```pyfrom 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.
```pyK1 = int(K1, 2)K2 = int(K2, 2)
R3 = int(R3, 2)L3 = int(L3, 2)
L = K2 ^ R3 ^ K1R = 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.
```txt3k{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[1] = 150 - x[1];    }    for (auto &e : edges) {        e[0]--, e[1]--;    }    for (auto [u, v] : edges) {        GD_SEGMENT(coord[u][0], coord[u][1], coord[v][0], coord[v][1]);    }}```
Open the [`points.html`](https://github.com/goswami-rahul/ctf/blob/master/3kCTF2020/pyzzle/points.html) in browser to see the second flag.  
```txt3k{PYZZLE_FO_SHIZZLE_MY_NIZZLE}```