1

我按照教授的指示运行 FedoraCore6。我试图简单地运行由实验室说明提供的这个 shellcode,但我不断收到分段错误。我们被告知我们可以使用命令 gcc-fno-stack-protector call_shellcode 在关闭堆栈保护的情况下进行编译.c 无论我只是使用 gcc -o shell call_callshellcode.c 编译代码还是使用 -fno-stack-protector 命令我在启动代码时遇到分段错误而不是调用 shell ..有什么帮助吗?所以我得到了这个实验室的代码,如下所示:

#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
  • 首先,您必须确定您的程序 SEGFAULTs 的位置。一种方法是运行dmesg| tail. 此输出中的最后一行将显示 SEGFAULT 发生时指令指针的位置。
  • 另一种方法是编译带有-ggdb标志集的程序。
  • 在您的 shell 上运行ulimit -c unlimited以确保在程序 SEGFAULT 时生成核心转储。
  • 在不更改代码的情况下运行您的程序,它应该显示Segmentation Fault (core dumped). 在您的本地目录中,您应该会看到一个名为core.
  • 运行gdb -c core以分析核心转储。
  • 进入gdb后,键入btbacktrace以查看 SEGFAULT 发生的确切位置。
  • 您还可以使用info registers, info locals,等info args命令来分析您拥有的值。使用x/x $esp(或任何其他寄存器名称)检查各个寄存器包含的内容。

    祝你好运!
于 2011-10-16T18:22:40.880 回答