PIE randomization
前の記事にコメントをいただいて、PIE randomizationのことを思い出したので、ちょい実験。PIEな実行ファイルは、どのアドレスにロードしても動くので、どこにロードするかはカーネルのfs/binfmt_elf.cあたりが適当に決めることが可能なわけですが、私の使ってるカーネルさんはPIEを毎回異なるランダムなアドレスにロードする(PIE randomization, aka ASLR)のか、それともどこか固定なアドレスにロードするのかを確かめたということです。
というのも、私は主にFedoraを使っているのですが、2.6.18-1.2798.fc6 では効いていたPIEのrandomizationが 2.6.22.4-45.fc6 とか 2.6.22.9-61.fc6 (今日現在の最新版) では効かなくなっておりまして。カーネルのメインラインのほうでも2006年末から似たようなコードのcommitとrevertを2-3回繰り返しているもので*1、結局どうなったんかなーと思い。昨日Fedoraの8を入れたので状況確認と。確認作業は簡単です。
#include <stdio.h> int main() { here: printf("%p\n", &&here); // mainのアドレスでもいいけど return 0; }
をFedora8の2.6.23.1-49.fc8で実行するだけ。
% gcc -fPIE -pie pie.c % ./a.out 0xb7fca539 % ./a.out 0xb7f23539 % ./a.out 0xb7f45539 % ./a.out 0xb7f06539
お、またrandomizeが効くようになってる。src.rpmを見ると、linux-2.6-execshield.patch にそういうコードが入っているようですね。binfmt_elf.cへの数行パッチ。以上、思い出したので実験&メモでした。いま翻訳している本*2 の事前調査も兼ねつつ。あ、もうひとつ、protection mechanismといえば、glibc-2.7で -D_FORTIFY_SOURCE=2がCだけでなくC++にも対応したので、Binary Hacksの記述が少し古くなりました。