1

Mac OS X を使用しています。バッファ オーバーフローの脆弱なプログラムを作成しました。

#include<stdio.h>
#include<string.h>

int neverCalled() {
    puts("You got me to be called");
    return 0;
}

int main() {
    puts("Name: ");
    char name[64];
    gets(name);
    return 0;
}

0x414141...また、88 個の「A」( )を含む入力ファイルを作成し、0x700E000001000000

gdb で実行する場合:

(gdb) run < input

私は出力を得ます:You got me to be calledそしてEXC_BAD_ACCESSエラー。プログラムの悪用に成功したことを意味します。

ターミナルで実行すると:

$ ./vulnerable < input

私は出力を取得します:Segmentation fault: 11そしてそれ以上のものはありません。

gdb ではバッファ オーバーフローが機能するのに、通常の端末では失敗するのはなぜですか。

4

2 に答える 2

1

Mac OS X 上の gdb は、アドレス空間レイアウトのランダム化を無効にしているようです

http://reverse.put.as/2011/08/11/how-gdb-disables-aslr-in-mac-os-x-lion/

于 2013-02-18T15:27:24.653 に答える
0

なぜ 0x700E000001000000 なのですか? あなたのエクスプロイトは、おそらく「p neverCalled」と入力したときにgdbが出力するものから、レイアウト固有のようです。

これは、すべての実行で保証されるわけではありません。cabellicar123 が正しく指摘したように、プロセス内でライブラリと実行可能ファイルがマップされるレイアウトはランダム化されており、実行間で同じであるとは限りません。

何らかの理由で、gdb は常に同じレイアウトを取得するようです。演習として、プログラムのどこかに "printf("%p"\n", neverCalled)" を含めて、値がどのように変化するかを確認してください。

于 2013-02-18T15:33:42.380 に答える