我正在按照教授的指示运行 FedoraCore6。我正在尝试简单地运行实验室说明提供的这个 shellcode,但我一直遇到段错误。我们被告知我们可以使用以下命令在关闭堆栈 gaurd 的情况下进行编译 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)();
}
最佳答案
- 首先,您必须确定您的程序出现 SEGFAULT 的位置。其中一种方法是运行
dmesg|尾部
。此输出的最后一行将显示发生 SEGFAULT 时指令指针所在的位置。 - 另一种方法是编译程序时设置
-ggdb
标记。 - 在您的 shell 上运行
ulimit -c unlimited
以确保在程序出现 SEGFAULT 时生成核心转储。 - 在不更改代码的情况下运行您的程序,它应该显示
Segmentation Fault (core dumped)
。在您的本地目录中,您应该会看到一个名为core
的新文件。 - 运行
gdb -c core
分析核心转储。 - 进入
gdb
后,键入bt
或backtrace
以查看 SEGFAULT 发生的确切位置。 - 您还可以使用
info registers
、info locals
、info args
等命令来分析您拥有的值。使用x/x $esp
(或任何其他寄存器名称)检查各个寄存器包含的内容。
祝你好运!
关于c - 学校实验室 Shellcode BufferOverflow 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786249/