[日本語] [English]

Hash browns

ELFファイル hash_browns が与えられた。

hash_brownsGhidraで逆コンパイルすると、以下のmain関数があった。

main.c

このmain関数は、コマンドライン引数として受け取った文字列の長さをチェックした後、 奇数番目の文字のMD5、偶数番目の文字のSHA-256を求め、それぞれの最初の5バイトの16進表記が指定のものかをチェックするものである。
比較対象は、MD5についてはテーブルを順に使うが、SHA-256は何らかの計算により使う場所を決めている。

また、ファイル hash_brownsstrings コマンドを適用すると、16進文字列が並んでいる部分があった。
そこで、16進文字列から文字を求める以下のプログラムを作成した。

solve.pl

stringsコマンドの出力をこのプログラムの入力として与えると、以下の文字列が得られた。

CkCF(o)=--~(_)~PTTOO~(@)+--*(o)461784ae~_^O8A~2)*7~p^((bT~_5-O{~=^+^=^)=O}

MD5はテーブルにある順に比較するため前半は意味がありそうだが、後半は非自明な順番になっているようである。

そこで、ファイル hash_browns に以下の改造を行い、 チェックを無効化した上でSHA-256の最初の部分と比較している文字列を順番に出力させるようにした。 (位置は0-origin)

改造したファイルをCS50 IDEで実行し、 その出力をsolve.plで処理すると、以下の文字列が得られた。

aeT{^^=(p)~==~~OAOO~~^^+(_)*^-_8527b}

先ほど得られた文字列の前半と、この文字列を以下のプログラムで合体させることで、flagが得られた。

patatokukasii.pl

CakeCTF{(^o^)==(-p-)~~(=_=)~~~POTATOOOO~~~(^@^)++(-_-)**(^o-)_486512778b4}

writeup by MikeCAT

CakeCTF 2021