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!}