Shellcode测试出错

Shellcode testing gone wrong

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

这是我得到的...

unsigned char code[] =
"\x90\x90\x90\x90\x90\x90\x90\x90";
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 上使用 Windows 的 MinGW compiler/debugger 套件。

编辑 - unsigned char code[] 而不是 char *code[] ... 仍然不起作用... 编辑 - 在 "shellcode" 的末尾添加了 ret (\xc3),仍然没有快乐...

您的 shell 代码 包含 nops、一个 0x00 操作码并且没有更多已知内容。我可以看到失败的 2 个原因:

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

尝试将 code 更改为 unsigned char const code[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";

或者,您可以尝试在 main() 函数中本地定义 code

int main(void) {
    unsigned char code[] = "\x90\x90\x90\x90\x90\x90\x90\xC3";

    printf("Code at %p, length = %i\n", (void*)code, (int)sizeof(code)-1);
    int (*ret)() = (int(*)())code;
    ret();
}

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

我明白了。毕竟我的 Windows XP SP3 VM 的 DEP(数据执行保护)实际上已经打开了。

要在 Windows XP 上关闭它,请按照 these 步骤操作。

对于 Windows Vista - Windows10 下载并安装 Enhanced Mitigation Experience Toolkit、运行 它,并指定您想要的安全设置。