嘿,我用了一段你们大多数人都熟悉的代码。它基本上接受一个字符数组,并将其强制转换为函数指针。有了这段代码,理论上你可以用它测试任何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,请下载并安装增强缓解体验工具包,运行它,并指定所需的安全设置。