【发布时间】:2016-12-17 03:46:45
【问题描述】:
嘿,我使用了一些你们大多数人都熟悉的代码。它基本上接受一个字符数组并将其转换为函数指针。使用此代码,理论上您可以使用它测试任何 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 编译器/调试器套件。
编辑 - unsigned char code[] 而不是 char *code[] ...仍然无法正常工作...
编辑 - 在“shellcode”末尾添加了ret (\xc3),仍然没有乐趣......
【问题讨论】:
-
那么你认为处理器一旦执行了那些
nops 会做什么? -
在这些 nop 之后需要一些 RET 操作码
-
被认为微不足道/无趣。在函数末尾缺少
ret是一个常见的新手错误,当您使用调试器单步执行时很容易解决。您必须了解 asm 才能设计 shellcode,因此您应该像处理任何其他 asm 函数一样对其进行处理和调试。 -
基本上需要一个字符数组,不,
char *code[]是指向char的指针数组,改成char code[] = "..."; -
“它基本上接受一个字符数组并将其转换为函数指针。” - 未定义的行为。阅读现代操作系统如何执行代码、程序的结构以及采取了哪些措施来完全抑制此类事情。 在你开始搞这些事情之前。
标签: c windows assembly mingw shellcode