学校实验室Shellcode Buffer Overflow的分段错误

时间:2011-10-16 18:09:04

标签: c buffer-overflow shellexecute shellcode

我按照教授的指示运行FedoraCore6。我试图简单地运行实验室指令提供的shellcode,我继续得到Segmentation故障。我们被告知我们可以通过使用命令关闭堆栈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)();
}

1 个答案:

答案 0 :(得分:4)

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

    祝你好运!