Tags: reversing encryption 

Rating:

# Simple Encryption

![description](img/desc.png)

> I found this small program on my computer and an encrypted file. Can you help me decrypt the file?

# Analysis

We are given two files, the binary (`chall`) and the encrypted flag (`flag.enc`). I opened up the binary in Ghidra but it had a long and complicated encryption function that I didn't want to look at yet, so I decided to do some experimenting with the program.

First, let's take a look at `flag.enc`:

```
$ xxd flag.enc
00000000: 7921 2331 1b3d 1715 273d 172d 2123 19bd y!#1.=..'=.-!#..
00000010: ebeb 6dbf 2f21 1f35 bf0d 2115 bf27 2d29 ..m./!.5..!..'-)
00000020: 3537 bf17 2f2d 19bf 1925 3d27 27bf 392f 57../-...%=''.9/
00000030: 3d27 2735 2331 35a3 ebeb 572f 35bf 3327 =''5#15...W/5.3'
00000040: 3d31 bf0d 2115 bf3d 1b35 bf27 2121 292d =1..!..=.5.'!!)-
00000050: 2331 bf33 211b bf2d 19bf 73b9 0959 9d25 #1.3!..-..s..Y.%
00000060: 1f27 9941 3523 391b 9d1f 179d 9f23 4133 .'.A5#9......#A3
00000070: 9f15 2337 419f 2341 319d 172f 153b bd05 ..#7A.#A1../.;..
00000080: eb
```

We see a lot of printable characters, but no obvious patterns.

Let's run the program, and do some test encryptions:

```
$ ./chall

_______ _____ _______ _____ _______
|______ | | | | |_____] | |______
______| __|__ | | | | |_____ |______

_______ __ _ _______ ______ __ __ _____ _______ _____ ______
|______ | \ | | |_____/ \_/ |_____] | | | |_____/
|______ | \_| |_____ | \_ | | | |_____| | \_

Use: ./chall <input_file> <output_file>

$ echo "aaaaqwerty" > test.in
$ ./chall test.in test.out

_______ _____ _______ _____ _______
|______ | | | | |_____] | |______
______| __|__ | | | | |_____ |______

_______ __ _ _______ ______ __ __ _____ _______ _____ ______
|______ | \ | | |_____/ \_/ |_____] | | | |_____/
|______ | \_| |_____ | \_ | | | |_____| | \_

$ xxd test.out
00000000: 3d3d 3d3d 1d11 351b 170d eb ====..5....
```

We see that each `a` became `=`, so we know it's a fixed key or operation being used for each byte. With this knowledge, I wrote a script that would encrypt all printable characters and build a map between the character and the encrypted one, and used that to reverse the encryption done to the flag file:

```py
import string
import subprocess

alphabet = string.printable

with open("alpha.in", "w") as f:
f.write(alphabet)

subprocess.run(["./chall", "alpha.in", "alpha.out"])

key = {}

with open("alpha.out", "rb") as f:
for i in range(len(alphabet)):
key[alphabet[i]] = f.read(1)

in_list = list(key.values())
out_list = list(key.keys())
flag = ""

with open("flag.enc", "rb") as f:
data = f.read()

for d in data:
b = bytes([d])
assert(b in in_list)

flag += out_list[in_list.index(b)]

print(flag)
```

When we run the script, we are greeted with the flag:

```
$ ./solve.py

_______ _____ _______ _____ _______
|______ | | | | |_____] | |______
______| __|__ | | | | |_____ |______

_______ __ _ _______ ______ __ __ _____ _______ _____ ______
|______ | \ | | |_____/ \_/ |_____] | | | |_____/
|______ | \_| |_____ | \_ | | | |_____| | \_

Congratulations!

I hope you liked this small challenge.

The flag you are looking for is F#{S1mpl3_encr1pt10n_f0und_0n_g1thub!}

```