第三話:ASLRの意味をデバッガで見てみる
※初めての方はまず「OllyDbgを使ってx86アセンブラとデバッガの基礎の基礎を学ぼう」と第零話「まずは動かしてみる 〜ブレイクポイントとステップ実行〜」をご一読ください。
目次のページに書いた通り、このシリーズではASLRという機能を無効にしたWindows 7を使っています。これを有効にしたり無効にしたりすると何が起こるかをデバッガで見てみます。
ASLRとは
英語ではAddress space layout randomization、日本語では「アドレス空間配置のランダム化」と言ったりします。
「第二話:メモリマップから見るコードとスタックの場所」では、命令コードが00401000から、スタック領域は0012D000から始まっていましたね。
ASLRを無効にしている場合、このアドレスは常に固定されています。ASLRを有効にしている場合(デフォルトで有効)、このアドレスがランダム化されるわけです。何回かデバッガで開いてみてメモリマップを比較してみます。
各領域の起点を見てみると、1回目はスタックが0028D000、コードが012B1000、2回目はスタックが0015D000、コードが00291000、3回目はスタックが0024D000、コードが01371000になっています。毎回違いますね。というか、デフォルトでこうなっているはずなのでこっちが普通。
ちなみに、プログラムの再実行では、下の方のSYSFERとかkernel32とかのアドレスは変わりません。これらのアドレスはマシン起動時に決められるようで、再起動すると変わります。
これらはウィンドウを表示するとか、ファイルを作るとか、Windowsそのものの機能を提供しているライブラリ(DLL)です。Windowsの各機能は、これらのDLLファイルで実装されているAPI()を呼び出すことで使うことができます。
たとえば下図の、GetCommandLineAというやつは、kernel32.dllで実装されている、コマンドライン引数を取得するAPIです。
ASLRの利点
第二話の最後にDEPの話をしました。スタック領域の実行権限をはずすことで、「スタック領域にコードを書いてそれを実行」をできないようにする対策です。
そうなると当然攻撃者はそれ以外の方法を探します。Windowsのライブラリにある、DEPを無効にするAPIを呼び出すとか、直接コマンドラインを起動しちゃうとか。
で、その手の攻撃では、ライブラリが仮想メモリ上のどこにあるのか、を知る必要があります。
ASLRが無効の場合には、アドレスが常に固定されているので簡単なのですが、ASLRが有効な場合は当然探すのが難しくなります。DEPに加えASLRを有効にしておくと、攻撃の成功率を下げることができるわけです。でも今はASLRが有効でも成功する攻撃手法なんかもあったりするのでいたちごっこなのですが。
以上、ASLRの話でした。