4

スタックベースのオーバーフローについて学び、スタックを利用するための簡単なコードを書こうとしています。しかし、どういうわけかそれはまったく機能しませんが、私のマシン(mac os leopard)にAbortトラップのみが表示されます

Mac osはオーバーフローの扱いが違うと思いますが、cコードでメモリを上書きすることはできません。例えば、

strcpy(buffer, input) // lets say char buffer[6] but input is 7 bytes 

Linuxマシンでは、このコードは次のスタックを正常に上書きしますが、mac osでは防止されます(トラップの中止)

Macマシンで単純なスタックベースオーバーフローを実行する方法を知っている人はいますか?

4

4 に答える 4

14

@jovehaの答え-fno-stack-protectorは正解です。GCCでは、バッファオーバーフロー保護を有効にするためにコンパイルする必要があります。

ただし、さらにこのオプションを無効にする必要があります。無効にしないと、またはFORTIFY_SOURCEのようなものを使用するバッファオーバーフローを実行しようとすると、「トラップの中止」が発生します。strcpymemcpy

これを無効にするには、フラグを使用してコンパイルします-D_FORTIFY_SOURCE=0。次に例を示します。

gcc -g -fno-stack-protector -D_FORTIFY_SOURCE=0 -o overflow overflow.c

出典:GCCでバッファオーバーフロー保護をオフにします。

于 2013-06-11T22:38:29.433 に答える
5

含む

int main(int argc, char **argv) {
    char buffer[4];
    puts("Hello");
    gets(buffer);
    return 0;)
}

そしてそれを次のように呼びます:

printf "0123456789abcdefghij\260\037" | ./a.out

\ 260 \ 037は、8進数およびリトルエンディアン順のmain(ここでは0x1fb0)のアドレスです。

バスエラーが発生する前に、helloprintが2回表示されるはずです。秘訣は、デバッガーを使用して(gdbでも可能です)、最終的にどこに行きたいのか、どこにリターンアドレスがあるのか​​を知ることです。Linuxと同じではありません!

MacOS X for i386(実際にはLinuxとWindowsを含むi386のほとんどのOS)、特に<=Leopardは最も安全なOSではありません。

編集:コンパイラとしてclangを使用していることに気づきました。したがって、gccに適合させる必要がありますが、ほとんど変更を加えなくても機能することがわかります:p。

于 2010-06-11T23:31:01.970 に答える
4

スタックオーバーフロー?

スタックオーバーフローという用語は、スタックサイズが現在のプラットフォームや構成で許可されている最大制限を超えようとする状況を指します。あなたがやろうとしていることは、スタックオーバーフローとはまったく関係がありません。スタックオーバーフローを確認したい場合は、無限再帰関数を記述して実行し、オーバーフローするまで待ちます。

void foo() {
  foo();
}

(コンパイラーが末尾再帰をサイクルに最適化しないことを望んでいます。最適化する場合は、少し複雑で非末尾再帰にします。)

あなたがやろうとしているように見えるのは、悪名高いバッファオーバーフローの悪用を再現することです。問題のバッファはスタックに割り当てられることになっていますが、このエクスプロイトは「スタックオーバーフロー」と呼ばれることはありません。このエクスプロイトを実際に示すには、バッファの境界をオーバーランするだけでは不十分です。重要なのは、格納されたリターンアドレスが元々占有していたスタックの領域に事前に決定された値を設定することです。これにより、関数が終了すると、元の呼び出し元のコードではなく、他の(おそらく悪意のある)コードに「戻り」ます。 。

それで、あなたは何をしようとしているのですか?スタックオーバーフロー?またはバッファオーバーフロー?

于 2010-06-11T21:53:58.433 に答える
3

Mac OSのコンパイラは、アボートトラップを提供するスタックカナリアにコンパイルされています。無効にする方法については、コンパイラのマニュアルを検索してください。

GCCでは、このオプションは-fno-stack-protectorです。

別の注意点として、1バイトのオーバーフローは、コンパイラスタックチェック以外のものをトリガーするのに十分ではないことは確かです。12バイトのようなものを使用してください:)

于 2010-06-12T12:56:18.237 に答える