siunam's Website

My personal website

Home Writeups Blog Projects About E-Portfolio

Either or Neither nor

Overview

Background

Made by MetaCTF

Oh no! I was working on this challenge and totally forgot to save a backup of the decryption key! Do you think you could take a look and see if you can recover it for me?

NOTE: The flag format is MetaCTF{}

https://metaproblems.com/6ebee70f0d78d94a4750f9cb70031965/chal.py

Find the flag

In this challenge, we can download a file:

┌[siunam♥earth]-(~/ctf/RITSEC-CTF-2023/Crypto/Either-or-Neither-nor)-[2023.04.01|21:54:34(HKT)]
└> file chal.py 
chal.py: Python script, ASCII text executable

It’s a Python script:

#! /usr/bin/env python

flag = "XXXXXXXXXXXXXXXXXXXXX"
enc_flag = [91,241,101,166,85,192,87,188,110,164,99,152,98,252,34,152,117,164,99,162,107]

key = [0, 0, 0, 0]
KEY_LEN = 4

# Encrypt the flag
for idx, c in enumerate(flag):
    enc_flag = ord(c) ^ key[idx % len(key)]

The flag is being XOR’ed!

To reverse that process, we can XOR back the enc_flag.

However, I wasn’t able to reverse it… Maybe I need to brute force the key??

Hmm… Maybe my Python skill sucks.

Let’s Google “XOR brute force online”:

dCode always work for me.

But first, we need to convert those enc_flag ASCII decimal to hex:

#!/usr/bin/env python3

def main():
    enc_flag = [91,241,101,166,85,192,87,188,110,164,99,152,98,252,34,152,117,164,99,162,107]
    hexedEnc_flag = '0x'
    
    for c in enc_flag:
        hexedEnc_flag += hex(c)[2:]
    print(hexedEnc_flag)

if __name__ == '__main__':
    main()
┌[siunam♥earth]-(~/ctf/RITSEC-CTF-2023/Crypto/Either-or-Neither-nor)-[2023.04.02|23:17:34(HKT)]
└> python3 solve.py
0x5bf165a655c057bc6ea4639862fc229875a463a26b

Then, copy and paste that to XOR decoder:

Next, choose “KNOWING THE KEY SIZE (IN BYTES)”, and type 4. This is because the KEY_LEN is 4.

Finally, choose “RESULT FORMAT” to “ASCII (PRINTABLE) CHARACTERS”, and click “ENCRYPT/DECRYPT”:

Hmm… Those looks like the flag??

Since the flag format is MetaCTF{}, we can search for that pattern:

Boom! We found it!

Conclusion

What we’ve learned:

  1. Many Time Pad XOR