1

教授の指示に従って、FedoraCore6を実行しています。ラボの指示で提供されているこのシェルコードを単純に実行しようとしているのですが、セグメンテーション エラーが発生し続けています.gcc-fno-stack-protector call_shellcode コマンドを使用して、スタック ガードをオフにしてコンパイルできると言われています。 .c どちらの方法でも、gcc -o shell call_callshellcode.c を使用してコードをコンパイルするか、-fno-stack-protector コマンドを使用して、シェルが呼び出される代わりにコードを起動するときにセグメンテーション エラーが発生します。したがって、このラボのコードは次のように提供されます。

#include <stdlib.h>
#include <stdio.h>

    const char code[] = 
    "\x31\xc0"
    "\x50"
    "\x68""//sh"
    "\x68""\bin"
    "\x89\xe3"
    "\x50"
    "\x53"
    "\x89\xe1"
    "\x99"
    "\xb0\x0b"
    "\xcd\x80"
    ; 

int main(int argc, char **argv)
{
    char buf[sizeof(code)];
    strcpy(buf, code);
    ((void(*) ( ))buf)();
}
4

1 に答える 1

4
  • まず、プログラムの SEGFAULT がどこにあるかを特定する必要があります。これを行う方法の 1 つは、 を実行することdmesg| tailです。この出力の最後の行は、SEGFAULT が発生したときの命令ポインタの場所を示しています。
  • -ggdbもう 1 つの方法は、フラグを設定してプログラムをコンパイルすることです。
  • シェルで実行ulimit -c unlimitedして、プログラムが SEGFAULT したときにコア ダンプが生成されるようにします。
  • コードを変更せずにプログラムを実行すると、Segmentation Fault (core dumped). ローカル ディレクトリに、core.
  • 実行gdb -c coreしてコア ダンプを分析します。
  • gdbに入ったら、btまたはと入力backtraceして、SEGFAULT が発生した場所を正確に確認します。
  • info registers、、などのコマンドを使用して、値を分析することもできinfo localsますinfo argsx/x $esp(またはその他のレジスタ名) を使用して、個々のレジスタの内容を確認します 。

    幸運を!
于 2011-10-16T18:22:40.880 に答える