デバッグ最終回
お待たせしました。
本日より新しい会計年度が始まり、心機一転の蔵本です。
弊社では、本日より2011年会計年度です。
本日の一枚は、猫写真です。
いやー、やっぱり猫は癒されますねー!最高にかわいい!子猫もたくさんいました。
さて、3週に渡って続いてきた、プログラムのデバッグも、今回で最後です。
今回は、いよいよ核心に迫ります。
前々回でCMP命令をNOPに書き換える事で、2000年以前でしか表示できないダイアログを表示させることができましたね。
そして、前回の解析で、このプログラムの動きは下記の流れである事がわかりました。
1.CMP命令で取得した日時と2000年以前か否かを比較します。
2.2000年以降である場合は、ジャンプせず、下図1のダイアログボックスが表示されます。
3.2000年以前である場合は、JBE命令に従ってジャンプし、下図2のダイアログボックスが表示されます。
つまり、図2のダイアログボックスを表示させるには、ジャンプさせれば良い訳ですね。
そこでどうやってジャンプさせるかが大事になってきますが、JBEでジャンプする際の条件を考えてみましょう。
JBEは、EFLAGSレジスタの CF=1 or ZF =1 でジャンプする命令です。
ということは、要するに、CFかZFを1にしてやればジャンプすると言うことになります。
では、いくつかブレイクポイントを設定しながら、EFLAGSレジスタの中身を見ていきましょう。
CMP命令とJBE命令のアドレスにブレイクポイントを設定し、実行してみます。
するとまずはCMP命令部分に設定したブレイクポイントでプログラムが停止しているはずです。
ここで、EFLAGSレジスタのCFとZFの中身を見てみると、CF=0 , ZF = 1 となっています。
ここからさらに実行してみます。
すると今度はJBE命令部分に設定したブレイクポイントでプログラムが停止しているはずです。
ここで再びEFLAGSレジスタのCFとZFの中身を見てみると、CF=0,ZF=0 となっているのがわかります。
つまり、CMP命令を実行した結果として ZF に 0 をセットしています。
したがって、このプログラムはジャンプせずに、図1のダイアログボックスを表示する動きになるわけですね。
ちなみに先ほどの、JBE命令部分のブレイクポイントで停止している時に、ZFに 1 をセットしてやって続きを実行してやると、図2のダイアログボックスが表示されます。
ZFをダブルクリックしてやれば、簡単にフラグを切り替えることができますので、お試しください。
さてさて、CMP命令部分のブレイクポイントで停止した時CFは0、そして、ZFは1でした、そして、CMP命令が実行される事で、CFは0のままですが、ZFに0がセットされてしまっています。
と、言うことは、CMP命令を実行させなければ、JBE命令でジャンプする条件である、CF = 1 or ZF = 1 が実現できるということになります。
そこで、「何もしない」命令である、「NOP(0×90)」でCMPを上書きする事で、フラグがCF=0 , ZF = 1 のままとなり、JBE命令でジャンプして、図2のダイアログボックスが表示された訳です!
ここまで約3週に渡って逆アセンブルやデバッグ絡みのお話をお伝えしてきましたが、如何でしたしょうか?
難しく感じる方もいらっしゃったかもしれませんが、慣れてしまえば大丈夫です。プログラミングやデバッグは、最高に遊べる脳トレですので、楽しく学べるのではないかと思います。
また、この辺りの技術はセキュリティエンジニアの方にとっては、必修項目ですので、是非習得しましょう!
当たり前ですが、自分で作ったプログラム以外は絶対に逆アセンブルしないでくださいね!