Tags: qrcode
Rating: 4.0
The "encoded.txt" file contains just 0s and 1s; one per line.
```python
with open("encoded.txt", "r") as f:
data = f.read()
info = data.replace("\n", "")
```
this script prints the content of the file stripping the newline char. Moving around your teminal emulator you can eventually get:
![](https://i.imgur.com/YbPI0ly.png)
This two QRcode are equals but shifted by just a line. With PIL it's easy to get the QRcode into a png.
```python
from PIL import Image
import sys
with open("encoded.txt", "r") as f:
data = f.read()
info = data.replace("\n", "")
# Split the lines by 200 and then in half
qr1 = ""
qr2 = ""
for i in range(0, 10000000, 200):
qr1 += info[i : i + 100]
qr2 += info[i + 100 : i + 200]
# Create the matrixes
qrm1 = [qr1[i : i + 100] for i in range(0, 5000, 100)]
qrm2 = [qr2[i + 100 : i + 200] for i in range(0, 5000, 100)]
qrcode1 = Image.new("RGB", (100, 100), "white")
qrcode2 = Image.new("RGB", (100, 100), "white")
qrcode1_pixels = qrcode1.load()
qrcode2_pixels = qrcode2.load()
# Fill and save the PNGs
try:
for x in range(100):
for y in range(100):
if qrm1[x][y] == "1":
qrcode1_pixels[x, y] = (0, 0, 0)
except Exception as e:
print(e)
qrcode1.save("qrcode1.png")
try:
for x in range(100):
for y in range(100):
if qrm1[x][y] == "1":
qrcode2_pixels[x, y] = (0, 0, 0)
except:
pass
qrcode2.save("qrcode2.png")
```
Eventually the QRcode in output return a string:
> 160f15011d1b095339595138535f135613595e1a
![](https://i.imgur.com/0y05kM1.jpg)
The strings could be a cipher text XORed with some unknown key...but! Since we know part of the plain text we can check if the ciphertext leaks some infos.
From [CyberChef](https://gchq.github.io/CyberChef/#recipe=From_Hex('Auto')XOR(%7B'option':'UTF8','string':'pctf%7B'%7D,'Standard',false)&input=MTYwZjE1MDExZDFiMDk1MzM5NTk1MTM4NTM1ZjEzNTYxMzU5NWUxYQ) we can see that the first part of the key is `flag`.
Just using `flag` as [key we got the flag](https://gchq.github.io/CyberChef/#recipe=From_Hex('Auto')XOR(%7B'option':'UTF8','string':'flag'%7D,'Standard',false)&input=MTYwZjE1MDExZDFiMDk1MzM5NTk1MTM4NTM1ZjEzNTYxMzU5NWUxYQ):
> `pctf{wh4_50_53r1u5?}`