1

へー、

私は自分のプログラムを悪用するためにgdbを使用しています

int main(int argc, char *argv[]) {
if(argc < 2) {
    printf("You have vergotten to fill in a value\n");
    exit(0);
}

char buffer[10];
strcpy(buffer, argv[1]);
printf("the value you supplie is ");
printf(buffer);
printf("\n");

return 0;
}

vindeo チュートリアルで、彼は gdb に「AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA を実行してください」と入力すると、次のようになるはずです。

program received signal SIGSEGV, sementation fault.
0x41414141 in ?? ()

しかし、私はSIGABRTを手に入れました

*** stack smashing detected ***: /root/Desktop/out terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x37)[0x7ffff7b59217]
/lib/libc.so.6(__fortify_fail+0x0)[0x7ffff7b591e0]
/root/Desktop/out[0x400759]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7ffff7a78c4d]
/root/Desktop/out[0x400609]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 148883                                 /root/Desktop    /out
00600000-00601000 r--p 00000000 08:01 148883                             /root/Desktop    /out
00601000-00602000 rw-p 00001000 08:01 148883                             /root/D

など、そしてSIGABRT

SIGSEGV ではなく SIGABRT を取得する理由は何ですか?

4

1 に答える 1

6

あなたのコンパイラは、スタック破壊保護を実装しています。ランタイムはそれについて教えてくれます。バッファを関数の外に置いてみてください - セグメンテーション違反が発生する可能性が最も高いです。

ところで、 の下でエクスプロイトで遊ぶのは最高のアイデアではありませんroot

于 2012-06-17T20:40:29.387 に答える