あとは、修正したファイルを展開して中のファイルを閲覧して終わり。challenge.MISCチャレンジということで、実行ファイルに何か隠されているだろうとバイナリを眺めてみたらMZスタブが普通の実行ファイルに比べて大きい。あからさまに何かある。freeで実行ファイルをDOSプログラムとして解析させてみる。解析結果は割と小さく、どうやらデータをXORしているだけらしい。endsフラグを得るプログラムは以下のようになった。flow?とりあえず、逆アセンブル。no_flo.asmmainのアセンブリ。retmain関数はなんとなくこんな感じ。readで標準入力から読み込んだデータを2つのバッファへ交互に格納。f_4006c6()、f_400f18()でそれぞれ入力されたデータのチェック。flow!!が出力される流れ。入力データがフラグになるだろうと予想。されるルート(比較結果がイコール)になる入力を求める。関数の返却値は、r8dレジスタに格納され、NGの文字が入力されていた場合、r8dに0が格納される。:f_400f18の処理は、f_402c77でsigaction@pltで登録されたシグナル処理を利用してデータチェックをしている。sigactionでは、SIGFPEのシグナル時の処理として、f_4005a0が登録されている。SIGFPEは浮動小数点例外(0除算処理)時のシグナル。ポインターを受けとる。retチェック処理は、400f84にあるようにワザと0除算をして、SIGFPEに登録したシグナルハンドラを呼び出している。シグナルハンドラーの結果がOKだったら、0x603340にjmp先のアドレスが返却されてくる。f_400f18関数の返却値は、esiレジスタに格納され、NGの文字が入力されていた場合、esiに0が格納される。ポインター)のなかのEFLAGSを利用してデータの比較結果を確認していた。