画像ファイル chall.png
と、それを作ったと考えられるプログラム chall.py
が与えられた。
chall.py
を読むと、画像はランダムな値のLSBにflagの各ビットを順にORして作っていることが読み取れた。
ということは、flagのあるビットが0ならば対応する値のLSBは0のことも1のこともあるが、flagのあるビットが1ならば対応する値のLSBは必ず1になるはずである。
そこで、まず chall.png
を
そして、以下のプログラムで、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
Then, I recoverted the data via this program with changing the assumution of how many bits are in the flag:
出力の中にあった文字列を反転させ、先頭に C
を補うことで、flagが得られた。
I obtained the flag by reversing the string in the output and adding C
to the head of the string.