Shellcode测试出错了
嘿,我正在使用你们大多数人都熟悉的代码。它基本上需要一个字符数组并将其转换为函数指针。有了这个代码,你可以在理论上测试任何shellcode的功能,如果它的行为将会是一个非常有价值的程序...我在Windows XP SP3上这样做,并使用MinGW的gcc来编译和gdb来调试该死的东西。Shellcode测试出错了
下面是我得到了什么?
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();
}
所以我决定使用空指令为“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[]
...还是不行... 编辑 - 添加了ret (\xc3)
在 “shellcode的”,仍然没有喜悦的最后......
我想通了。毕竟,我的Windows XP SP3虚拟机的DEP(数据执行保护)实际上是开启的。
要在Windows XP上关闭它,请按照these的步骤操作。
对于Windows Vista - Windows 10下载并安装Enhanced Mitigation Experience Toolkit,运行它并指定所需的安全设置。
你shell代码包含nops,0x00
操作码并且没有其他已知内容。我可以看到2个原因导致失败:
- 操作系统可能不允许您从存储字符串文本的段中运行代码。
- 操作不以
RET
操作码结束的顺序,所以你最终运行一些随机的未知操作码...
尝试改变code
到unsigned char const code[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";
或者,你可以尝试定义code
当地的main()
功能:
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();
}
这两种方法是保证工作,因为位置其中t他编译器存储的code
数组可能不可执行。
那么你认为处理器执行这些'nop'后会做什么? – EOF
一些RET操作码将被需要在这些挪威 –
downvoted作为微不足道/无趣。在函数结尾缺少“ret”是一个常见的新手错误,当您单独使用调试器时,这个错误很容易解决。你必须知道asm来设计shellcode,所以你应该像处理其他asm函数一样工作并调试它。 –