2014/11/15 21:49 |
Windows7にASLRという厄介な機能が実装されていることを今知った。 さてこれは何かというと、経験上32bitのwindowsのexeファイルは、よほど変な奴じゃないかぎりは、 0x400000~読み込まれて、0x401000~プログラムが配置される。 まあEXE自体はリロケータブルなので、本来は別の場所にロードしてもきちんとロードされるはず・・・、が、 そもそも0x400000以外に読み込まれることもないので、本来はリロケート用の情報を持つはずが、アドレス直書きとかしてあったりする。 で、このASLRって機能が有効(windows7以降デフォルトで有効)になっていると、この0x400000~読み込まれるという常識が 崩れて、ランダムなアドレスから読み込まれることになる。 これはちょっと逆アセ結果見ながらデバッグするときとか不便だし、そもそもプロセスにアタッチしてパッチするソフトが いろいろ動かなかったりと不便である。 ちなみに、コンパイル時にASLR有効設定でコンパイルしたもの以外はASLRは無効になるので、既存ソフトが動かなくなる心配はない。 が、既存ソフトが他プロセスにアタッチしたりするようなことをすると、アタッチ先がASLR有効コンパイルされてると動かない。 まあ何があったかというと以下みたいな感じ。 OpenProcessで他プロセス開いて、ReadProcessMemoryとかするとき0x400000を直指定すると落ちる。いや、実際には落ちないでちゃんと エラー帰ってくるorきちんと読み込まれるんだが、なにせバイナリがランダムに配置されているので、0x400000から読み込んでヘッダ 解析しようとしても、読み込みエラーが戻ってくるかもしくはあとから確保されたメモリが読めてまったくexe本体とは関係ないものが 読めるかだ。 だいたいヘッダ解析してそこから各セクションアドレスを計算してさらにReadProcessMemoryとかするので、絶対どこかで失敗する。 とかまあそんな感じ。 なんでこんな機能があるかというと、セキュリティの向上らしい。たしかにちょっとは向上しそうだけどね。 つまり、脆弱性を突いてあるプロセスの権限乗っ取ったとしても、バイナリの場所わからないと何もできないでしょーってこと。 本当に有効なのかは甚だ疑問。 まあ普通に使ってる限り特にASLRが有効になっていることを気にすることもないだろうけど、 デバッガー(というかクラッカー?ハッカー?)にとっては邪魔であることは間違いない。 というわけでOFFにする方法を下記に。 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management] "MoveImages"=dword:00000001 再起動で有効。 ちなみに64bit版だとどういう挙動するかは知りません。64bitのASLRソフト今のところ気づいたのないし。 困ったのでもし他にも困ってる人いたらなーということでメモでした。 |
2014/11/3 22:06 |
降雪を確認 |
2014/11/1 10:06 |
あ、先月1回も書いてない |