ファイルが与えられるため、fileコマンドで確認する。すればWordやWordpadでファイルを開ける。ファイルが与えられる。fileコマンドで確認。dataバイナリデータっぽい。FLAG出てきました。ここからアセンブラを見ていく。ctf_bin3.exe実行してみると、誰だか聞かれる。正しい名前を入力する必要がある模様。failed...stringsコマンドを打ってもFLAGっぽい文字列は見つからないため、IDAで逆アセンブルする。あたりの文字列から探せばすぐに見つかった。0かどうか確認し、0の場合に右側の失敗ルートに入っているようだ。ことは、ここでalが0以外の状態か、ここの命令を書き換えると左側(赤矢印)の成功ルートに入れる。手っ取り早く命令を書き換えてみることにする。上図の青四角がアドレスである。jmp命令2バイト分をNOP(何もしない命令:0x90)に書き換えると、条件判断をせずに無条件で左のルートに入ることができる。IDAがFree版で書き換え機能がないので、他のバイナリエディタを使って書き換えを行った。(←実際は文字化け)ですよね。ないとstrings打った時点でFLAG出てますよね。いう関数へのCall命令がある(赤四角の少し上の部分)ので、その中を見てみる。あ、ちなみに画像に出てくる関数名や変数名はリネーム済み。コメントアウトも追記したものです。その後3bit右ローテーションする処理を繰り返し、入力値の正否を判断する文字列を生成している。ROTATION_AND_XORどうせなので、flag生成のところも見てみる。最初に見ていたところの左側(赤矢印)ルートの真下に、親切にもFlagを生成するロジックがある。コメントとかリネームいれているので、これだけでわかると思うけど簡単に言ってしまうと、1で文字数をカウントし、2で、バイナリ内に存在するテーブル値と入力値をXORすることでFlagを生成している模様。このとおりにトレースしてみると、確かにFlagが生成されている。これもアセンブラだった。ctf_bin4.exe実行してみると、Debugモードでないと動かんと言われる。関数をチャート化してみた。memcpyとかも怪しいけど、ぱっと見、startから右下に下がっていったところ(赤四角部分)が怪しいかなと思い、見てみるとビンゴ。loc_40143Aから左下に下りたところらへんでFlagとかセットしてそう。OllyDbgで開いてみて、このへんにBreakPointつけたら、Flag出てきました。Flag{Flag_is_always_with_debugger}というわけで、詳しく見てみる。文字列を取ってきてdecode処理をしている箇所になる。ここのループを抜けるとFlag文字列が出来上がっている。この関数の中身は以下のような処理が走っている。1で、1msのタイマーをセット2でFlag文字列をセットして3でメッセージボックスを表示でも、1ms後にメッセージボックス消失。この1msのタイマーを消してやれば、Flagが消滅せずに表示される。上図の青四角部分は、SetTimerを呼んでいるところのアドレス。"000009EC"のCall命令(000009EFまで)をNOPに書き換えてやる。呼び出し元関数にデバッガモードかどうかの判断ロジックがあるため、ここも改竄してあげる。すると、通常起動でも動作してFlagが表示される。この後の動作は、最初のFlag生成と同じdecode処理がもう一回走っている(赤枠部分)。(・ω<)」というメッセージボックスをもっかい出しているという流れだった。いうわけで、出てくるMessageBoxは全部で3つ。いう流れのプログラムなのであった。ctf_bin5はたまたこれもWindowsの実行ファイル。