# break a leg - CakeCTF 2021 ###### tags: `CakeCTF 2021` yaru-dake ```python= from PIL import Image img = Image.open("chall.png") w, h = img.size for x in range(w): a = img.getpixel((x, 0)) b = img.getpixel((x, 1)) c = img.getpixel((x, 2)) print(chr(list(set(a) & set(b) & set(c))[0]), end="") ``` さすがに簡単なのでこういう感じでどうですか ```python= from PIL import Image from random import getrandbits with open("flag.txt", "rb") as f: flag = int.from_bytes(f.read().strip(), "big") bitlen = flag.bit_length() data = [getrandbits(8)|((flag >> (i % bitlen)) & 1) for i in range(256 * 256 * 3)] img = Image.new("RGB", (256, 256)) img.putdata([tuple(data[i:i+3]) for i in range(0, len(data), 3)]) img.save("chall.png") ``` こういう感じで解く ```python= from PIL import Image img = Image.open("chall.png") w, h = img.size bits = [] for y in range(h): for x in range(w): a, b, c = img.getpixel((x, y)) bits += [a & 1, b & 1, c & 1] for flen in range(100, 1000): bits2 = [1 for i in range(flen)] for i, b in enumerate(bits): bits2[i % flen] &= b if any(b !=0 for b in bits2): x = sum(b*(2**i) for i, b in enumerate(bits2)) print(x.to_bytes((x.bit_length() + 7) // 8, "big")) ```