c - Shellcode测试出错



嘿,我用了一段你们大多数人都熟悉的代码。它基本上接受一个字符数组,并将其强制转换为函数指针。有了这段代码,理论上你可以用它测试任何shellcode的功能,这将是一个非常有价值的程序,我的工作,如果它的行为…我在Windows XP SP3上这样做,我使用MinGW的gcc来编译和gdb来调试该死的东西。

这是我得到的…

unsigned char code[] =
"x90x90x90x90x90x90x90x90";
main()
{
  printf("Code length = %i...n",sizeof(code)-1);
  int (*ret)()=(int(*)())code;
  ret();
}

所以我决定使用nops作为"shellcode",因为它对眼睛和大脑都很容易,而且无论如何都可能工作。遗憾的是,它没有。

当我编译并运行程序时,我得到…

An unhandled win32 exception occurred in horsefile.exe[3612].

…当我在gdb中运行它时,我得到…

Program received signal SIGSEV, Segmentation fault.
0x00409000 in code()

…其中0x00409000是shellcode函数ret()的入口点地址。

我关闭了DEP,因为我认为转换字符数组,我认为它在堆栈上(实际上可能在。data节中),并且堆栈上没有执行代码(转换将字符数组数据视为堆栈上的代码)。所以我把DEP关掉了,它还是不正常。

任何想法吗?请记住,我在Windows XP SP3上使用的是MinGW编译器/调试器套件。

EDIT - unsigned char code[]代替char *code[]…还是不行……编辑-在"shellcode"的末尾添加了ret (xc3),仍然没有乐趣…

您的shell代码包含nops, 0x00操作码和其他已知内容。我可以看到失败的两个原因:

  • 操作系统可能不允许从存储字符串字面值的段运行代码。
  • 操作序列不以RET操作码结束,因此您最终运行一些随机未知操作码…

尝试将code更改为unsigned char const code[] = "x90x90x90x90x90x90x90x90xC3";

或者,您可以尝试在main()函数中本地定义code:
int main(void) {
    unsigned char code[] = "x90x90x90x90x90x90x90xC3";
    printf("Code at %p, length = %in", (void*)code, (int)sizeof(code)-1);
    int (*ret)() = (int(*)())code;
    ret();
}

这两种方法都不能保证有效,因为编译器存储code数组的位置可能不是可执行的。

我明白了。我的Windows XP SP3虚拟机的DEP(数据执行阻止)实际上是打开的。

要在Windows XP中关闭它,请遵循以下步骤。

对于Windows Vista - Windows 10,请下载并安装增强缓解体验工具包,运行它,并指定所需的安全设置。

最新更新