■CTF用のBinary問題を考える。
問題の構成
・実行すると入力を促すプロンプトが現れる。
・正しい入力の場合はFlagが表示される。
・正しくない場合はNot Correctと表示されて終了。
■Flagを得る方法
1.Binary解析ツール(IDA-Free)を用いて入力項目が比較されている箇所を見つける。
2.比較した結果に応じて変わる処理部分をBinaryエディタを用いて無効化しどの入力をいれてもFlagが表示されるようにする。

■解析方法詳細
IDAのFree版をインストールしbin.exeを解析する。

・黄色い部分(jnzと表示)が入力文字比較の結果によって命令を分ける部分である。
・2つ上の「_strcmp」の結果が等しい場合はeaxレジスタにゼロが入る。
・次の「test」命令でeaxレジスタがゼロかどうかを計算し、ゼロの場合はZFフラグが1にセットされる。
・「jnz」命令はゼロではない場合(ZF=0)に401535にJumpする。
上記から、jnz命令の部分を無効にすることができれば、どの入力であってもFlagを表示する処理に移行できることがわかる。 このjnz命令をHex Viewでみると、下の「750E」部分が該当する命令部分となる
※詳細
0x75がjnz命令、0E先である401535にshortjumpする。 この部分を何も処理しないNOP命令である「9090」に置き換えるると、図の分岐は左となり、Flagが表示される。

IDA-Free版ではBinaryデータを編集できないため、FreeのBinaryエディタである「Stirling」で編集する。

Jnz命令である「750E」部分を「9090」に置き換えてbin-after.exeとして保存する。

書き換えたbin-after.exeを実行すると、どんな入力値でもFlagが表示されるようになる。

■まとめ
この問題ではパスワードをそのまま格納しているためIDAやBinaryエディタを用いてパスワードやFlagそのものを導き出すことも可能である。 これを防ぐには以下を検討する。
・パスワードのHash化(Crypt関数の利用)
・Flagの難読化(16進コードでの設定+大文字小文字変換処理を絡ませる)
・簡易な難読化として各文字をビット反転させる方法
簡易な難読化として各文字をビット反転させた場合のソースコードを以下に示す。