用于Windows的简单“Hello-World”,无null shellcode需要

问题描述:

我想通过编写“Hello World”到控制台(使用Windows XP 32位)来测试缓冲区溢出。 shellcode需要是无空的,以便通过“scanf”传递到我想溢出的程序中。我发现很多Linux的汇编教程,但是没有一个适用于Windows。有人可以请我通过这个使用NASM? Thxxx!用于Windows的简单“Hello-World”,无null shellcode需要

+0

好,组装操作码是Linux和Windows一样,这些教程事情应适用于窗口了。 – BlackBear 2011-01-09 17:57:58

+0

汇编操作码相同,但系统调用不同。有关更多详情,请参阅下面的答案。 :) – MarioVilas 2013-01-13 15:26:03

汇编语言由您的处理器定义,汇编语法由汇编器定义(因此,在& t和intel语法)主要区别(至少我认为它曾经是...)是窗口是实模式的(调用实际的中断来完成任务,并且可以使用计算机可访问的所有内存,而不仅仅是程序),并且linux是保护模式(您只能访问程序的小内存,你必须调用int 0x80并调用内核,而不是调用硬件和BIOS)。无论如何,hello世界类型的东西或多或少会在linux和windows之间相同,只要它们是兼容处理器。为了从你的程序中获取shellcode,只需将它加载到目标系统的 调试器(gdb for linux,调试windows),然后在调试中输入d(或者是它吗?不管怎样,它应该说如果你输入h(帮助)),并且指令和内存之间将是操作码。 只需将它们全部复制到您的文本编辑器中,并将其转换为一个字符串,然后制作一个将它们全部转换为ASCII值的程序。不知道如何做到这一点在gdb寿...

无论如何,使其成为一个bof漏洞,输入aaaaa ...并继续添加一个,直到它从缓冲区溢出错误崩溃 。但是,确切地找到它需要多少个才能使其崩溃。然后,它应该告诉你这是什么内存地址。通常它应该在错误信息中告诉你。如果它说'9797 [原来的返回地址的其余部分]',那么你明白了。现在,你必须使用你的调试器来找出这是哪里。用您的调试器反汇编程序并查找scanf被调用的位置。在那里设置一个断点,运行并检查堆栈。寻找所有那些97(我忘了提及'a'的ascii数字),看看它们在哪里结束。然后删除断点并输入你发现的数量(确切的数量),如果错误信息是'97缓冲区溢出'[原始返回地址的其余部分]“,则删除最后一个,将你发现的地址放入检查堆栈,并插入你的shellcode。如果一切顺利的话,你会看到你的shellcode执行。

快乐黑客...

大会的操作码是相同的,所以正规的招数仍然生产无空的shellcodes在Linux中,你使用“int 0x80”指令进行系统调用,而在Windows上,你必须使用DLL库并对t进行普通的usermode调用继承人导出的功能。

出于这个原因,在Windows上你的shellcode必须:

  • 硬编码的Win32 API函数地址(最有可能将只有你的机器上工作)
  • 使用Win32 API的解析器的shellcode(每工作Windows版本)

如果你只是在学习,现在只需要硬编码你在调试器中看到的地址。要使呼叫位置独立,您可以将地址加载到寄存器中。例如,调用带有4个参数的函数:

PUSH 4     ; argument #4 to the function 
PUSH 3     ; argument #3 to the function 
PUSH 2     ; argument #2 to the function 
PUSH 1     ; argument #1 to the function 
MOV EAX, 0xDEADBEEF  ; put the address of the function to call 
CALL EAX 

请注意,参数是按相反顺序推入的。在CALL指令EAX包含返回值之后,堆栈就像之前一样(即函数弹出自己的参数)。 ECX和EDX寄存器可能包含垃圾,所以不要依赖它们在通话后保留它们的值。

直接CALL指令将不起作用,因为这些指令是位置相关的。

为了避免零的地址本身尝试任何针对x86的shellcode无空招数,也有很多在那里,但我最喜欢的(虽然冗长)是使用XOR指令编码值:

MOV EAX, 0xDEADBEEF^0xFFFFFFFF ; your value xor'ed against an arbitrary mask 
XOR EAX, 0xFFFFFFFF    ; the arbitrary mask 

您也可以尝试使用NEG EAX或NOT EAX(符号反转和位翻转)来查看它们是否工作,它便宜得多(每个两个字节)。

你可以得到帮助,在不同的API函数可以调用的位置:http://msdn.microsoft.com

你需要的最重要的可能是以下几点:

第一次启动一个命令,接下来的两个是加载DLL文件并获取其功能的地址。

下面是一个完整的教程编写Windows的shellcode:http://www.codeproject.com/Articles/325776/The-Art-of-Win32-Shellcoding