1

glibc-2.9 を実行している 64 ビット システムの 1 つで脆弱性を検証する必要があります。

http://scarybeastsecurity.blogspot.in/2011/02/i-got-accidental-code-execution-via.html

上記のリンクは、マジック ナンバーを渡すと明らかに任意のコードの実行につながるスクリプトを提供します。しかし、自分のシステムで試してみたところ、何も起こっていないようです。私は何か間違ったことをしていますか?脆弱性が存在する場合、システムはクラッシュしますか? 偶発的なコード実行かどうかを検出するにはどうすればよいですか?

4

2 に答える 2

4

64 ビット マシンで実行している場合、バグの元の状況は適用されません。Chris のブログでわかるように、彼は 32 ビットの Ubuntu 9.04 システムを使用しています。このエクスプロイトは、スタック ポインタを 32 ビット アドレス空間にラップさせ、スタックの破損を引き起こすことに依存しています。

glibc 2.5 を搭載した 64 ビット システムで簡単に試してみましたが、クラッシュではなく malloc() の失敗が見られました。

$ ./a.out 3000000000
a.out: malloc() failed.

偶発的なコード実行を特定する方法を尋ねました。エクスプロイト/ペイロードを持たないここのおもちゃのプログラムでは、CPU がスタックのジャンク部分を「実行」しようとしたため、SIGSEGV、SIGILL、または SIGBUS のいずれかが表示され、それぞれのエラーとして表示されることが予想されます。シェルからのメッセージ。

于 2012-04-18T16:11:43.213 に答える
1

64 ビット マシンで問題が発生した場合は、元のコードを模倣する必要がありますが、64 ビット マシンでスタックをラップする番号を指定する必要があります。提供された元の番号は次のとおりです。

1073741796

$ bc
z=1073741796
z+28
1073741824
(z+28)*4
4294967296
2^32
4294967296
quit
$

したがって、入力数値を表す 1 つの方法は (ULONG_MAX - 112) / 4 です。

64 ビット マシンのアナログ番号は 4611686018427387876 です。

$ bc
x=2^64
x
18446744073709551616
y=x/4
y
4611686018427387904
y-28
4611686018427387876
quit
$

ただし、これが機能する可能性を維持するには、報告されたコードを変更して使用するstrtroull()か、同様のものを使用する必要があります。atoi()は通常 32 ビット整数に制限されており、上記の 64 ビット数値では使用できません。コードには以下も含まれます。

num_as = atoi(argv[1]);
if (num_as < 5) {
    errx(1, "Need 5.");
}
p = malloc(num_as);

num_asはです。size_t_ したがって、膨大な量のスペース (ほぼ 4 EiB)を使用できる必要があります。ほとんどの人は、バッキング用のディスク領域があっても、マシンに十分な仮想メモリがありません。さて、たぶん、たぶん、Linux はオーバーコミットを許可します (そして、後で OOM キラーを急襲させます) が、失敗する可能性が高くなります。pchar *malloc()malloc()

64 ビット システムには (まだ) 影響を与えられないが、32 ビット システムに影響を与える、関連するその他の機能がありました。

64 ビット マシンで再現する可能性がある場合は、おそらく 32 ビット コンパイルを行う必要があります。その後、追い風が吹いていて、適切な古いバージョンの関連ソフトウェアがあれば、おそらくそれを再現できます。

于 2012-04-23T06:57:20.870 に答える