/DYNAMICBASE一問一答

/DYNAMICBASEオプションによるベースアドレスのランダマイズ(以下ASLR)について、わかっているようでわかっていない人も多いかと思ったので細かい挙動についてまとめておきます。

なお以下はすべてWindows10 1809におけるもので、それ以降やそれ以前では異なることがあります。

Q:ASLRってなに?
A:この場で言うASLRは.exeや.dllがメモリ上にマップされるときのアドレスをランダムにしようぜって機能のこと

Q:どういう恩恵があるの?
A:攻撃されたときにアドレスがばれているかどうかは、攻撃者がLv1魔王とLv100魔王ぐらいには変わる、当然隠していた方がよい

Q:.exeはどれぐらいランダムなの?
A:実測したら254通り

Q:.exeのランダムの範囲は?
A:NULLページ(0x00000000のこと)や旧来のデフォルトベースアドレス(0x00400000-0x007F0000)を除いて0x00010000ごとに254か所の中からランダム
/BASEオプションが無指定なら0x00010000から、指定されていた場合そのアドレスから0x00FE0000引いたアドレスからになる

Q:.exeの再ランダマイズされる条件は?
A:OS再起動、またはtouchやコピーで属性が更新されたとき(アンロードや時間経過やリネームなどは含まれず)

Q:.dllはどれぐらいランダムなの?
A:仕様によれば256通りらしいが再起動必須であるため労力の関係から実測は叶わなかった

Q:.dllのランダムの範囲は?
A:以下推測も多く混ざる点に注意
OS起動時に0x7F000000-0x7FFF0000の間を0x00010000ごとに256か所の中からランダムで選ぶ
そこから後ろ詰めで1つでもロードされているDLLのアドレスを埋めていき、全プロセスでアンロードされたDLL部分を開放するを延々繰り返していると思われる

Q:.dllの再ランダマイズされる条件は?
A:OS再起動のみ
アドレス変化自体は全プロセスからアンロードしてから元アドレス付近が埋まるまで他.dllをロードし保持したまま改めてロードしなおせばよい
またはtouchやコピーで属性を更新した別dllを用意して別々に同時ロードするなどでもよい

Q:結局どういうこと?
A:.exeは254通りと少ないがランダマイズされているので比較的安心していい
.dllは.dll全体で1回のランダマイズなのでアドレスが1個でもばれたら全部ばれ得るので注意が必要