Break a leg

画像ファイル chall.png と、それを作ったと考えられるプログラム chall.py が与えられた。

chall.py を読むと、画像はランダムな値のLSBにflagの各ビットを順にORして作っていることが読み取れた。
ということは、flagのあるビットが0ならば対応する値のLSBは0のことも1のこともあるが、flagのあるビットが1ならば対応する値のLSBは必ず1になるはずである。

そこで、まず chall.pngCyberChefの Extract RGBA (Delimiter は空白、Include Alpha はオフ) で数字列に変換した。
そして、以下のプログラムで、flagのビット数の仮定を変えながら復元を行った。

An image file chall.png and a program that should generated the image chall.py were given.

Reading chall.py, I found that the image was generated by applying bitwise OR with each bits of the flag to random values.
This means that the LSB of corresponding value can be eithor 0 or 1 when a bit of the flag is 0, but the LSB must be 1 when a bit of the flag is 1.

Based on this, firstly I converted chall.png to a sequence of integers vla "Extract RGBA" (Delimiter: space, Include Alpha: off) on CyberChef.
Then, I recoverted the data via this program with changing the assumution of how many bits are in the flag:

solve.pl

出力の中にあった文字列を反転させ、先頭に C を補うことで、flagが得られた。

I obtained the flag by reversing the string in the output and adding C to the head of the string.

CakeCTF{1_w1sh_y0u_can_h1t_the_gr0und_runn1ng_fr0m_here;)}

CakeCTF 2021