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的”,仍然没有喜悦的最后......

+2

那么你认为处理器执行这些'nop'后会做什么? – EOF

+1

一些RET操作码将被需要在这些挪威 –

+2

downvoted作为微不足道/无趣。在函数结尾缺少“ret”是一个常见的新手错误,当您单独使用调试器时,这个错误很容易解决。你必须知道asm来设计shellcode,所以你应该像处理其他asm函数一样工作并调试它。 –

我想通了。毕竟,我的Windows XP SP3虚拟机的DEP(数据执行保护)实际上是开启的。

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

对于Windows Vista - Windows 10下载并安装Enhanced Mitigation Experience Toolkit,运行它并指定所需的安全设置。

shell代码包含nops,0x00操作码并且没有其他已知内容。我可以看到2个原因导致失败:

  • 操作系统可能不允许您从存储字符串文本的段中运行代码。
  • 操作不以RET操作码结束的顺序,所以你最终运行一些随机的未知操作码...

尝试改变codeunsigned 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数组可能不可执行。

+0

我确实加了ret操作码,仍然没有喜悦。我认为你的第一个想法是准确的。在gdb中,segfaults在函数的入口处......这说明内存地址有问题......我应该使用malloc来存储字符数组吗? malloc是否保留堆栈中的内存? – August

+0

@八月,_堆栈上的malloc保留内存?_不,你的意思是[alloca](http://man7.org/linux/man-pages/man3/alloca.3.html),但我怀疑它解决了它。 –

+0

@八月:'malloc'从堆中分配内存,而不是从堆栈中分配内存。我用堆栈中分配的代码更新了答案。 – chqrlie