記事一覧
第六話:EBPとESP、スタック領域の使われ方
前回の「第五話:スタックとLIFO、だから何?(怒)」はスタック領域の意味の分からなさにキレて終わったわけですが、今回はスタック領域の使われ方について触れたいと思います。
第五話でも書いた通り、スタック領域は変数などの値の一時的な格納場所です。枕詞として、各関数ごとに場所が違う、というのもつきます。
例えばこのシリーズで出てくるmain_sub.exeのスタック領域は以下のようなイメージです。
第五話:スタックとLIFO、だから何?(怒)
「第四話:CALL命令で起こること」で端折ったスタックの話です。
「スタック」という単語を(例えば情報処理技術者試験などの勉強をして)知っている人の知識としては、
1. 一時的に値を退避しておく場所である
2. Last In Fast Out(LIFO:最後に入れたものを最初に取り出す)である
この2つが挙げられると思います。
1.は読んで字のごとくだからいいとして、2.については実際に
第四話:CALL命令で起こること
今回はいよいよ佳境、CALL命令(とRET命令)についてです。
なぜCALL命令が佳境かというと、最終話で書くつもりのバッファオーバーフローを利用した古き良き攻撃手法は、CALL命令によるサブルーチンの呼び出しと、サブルーチンの処理を終えて元の関数に戻るRET命令がキモだからです。
CALL命令とは「第零話:まずは動かしてみる 〜ブレイクポイントとステップ実行〜」で述べた話を少し振り返ります。
第三話:ASLRの意味をデバッガで見てみる
※初めての方はまず「OllyDbgを使ってx86アセンブラとデバッガの基礎の基礎を学ぼう」と第零話「まずは動かしてみる 〜ブレイクポイントとステップ実行〜」をご一読ください。
目次のページに書いた通り、このシリーズではASLRという機能を無効にしたWindows 7を使っています。これを有効にしたり無効にしたりすると何が起こるかをデバッガで見てみます。
ASLRとは英語ではAddress s
第二話:メモリマップから見るコードとスタックの場所
(このノートは最後まで無料で読めます。投げ銭方式です)
今回はメモリマップの見方のお話です。
まずは第零話の「ブレイクポイント」の章と同じく、main()関数のところにブレイクポイントを設置して実行します。EIPがmain()関数の最初の命令の行を指します。
そこで[View]メニューから[Memory Map]を選択。
別のウィンドウにメモリマップが表示されます。
これは何かというと。
第一話:ステップイン/ステップオーバー/ステップアウト
※初めての方はまず「OllyDbgを使ってx86アセンブラとデバッガの基礎の基礎を学ぼう」と第零話「まずは動かしてみる 〜ブレイクポイントとステップ実行〜」をご一読ください。
第零話では「ステップ実行」をやってみました。この「ステップ実行」には、いくつかの種類があります。ステップイン・ステップオーバー・ステップアウトです。
第零話:まずは動かしてみる 〜ブレイクポイントとステップ実行〜
(このノートは最後まで無料で読めます。投げ銭方式です)
さて、なにはともあれOllyDbgを動かしてみましょう。
こちらのzipファイルをダウンロードし、展開して出てくるexeファイルをOllyDbgで開いてみてください。
ソースコードは以下のとおりです。
#include
int sub(int i, int j)
{
int x = 0;
x = i + j;