MASM shellcode和NASM shellcode是否有区别

问题描述:

我是*的新手。最近,我开始研究汇编,而且对于汇编来说是相当新的,对于shellcode来说是全新的。我正在使用RadAsm编译使用MASM汇编程序,我试图从这个网站学习shellcode Shellcoding for Linux and WindowsMASM shellcode和NASM shellcode是否有区别

我在Windows 64位上使用RadAsm。我使用的代码几乎相同,除了我使用函数的绝对名称而不是DLL中函数的地址。 shellcode应该使用睡眠函数,参数5000

这是我在MASM中使用的代码。

.386 
.model flat, stdcall 
option casemap:none 

include kernel32.inc 
includelib kernel32.lib 

.code 
_start: 
    xor eax, eax ; zero out eax 
    mov ebx, Sleep ; function sleep goes in ebx 
    mov ax, 5000 ; parameter goes in ax 
    push eax  ; parameter on stack 
    call ebx  ; call Sleep 
end _start 
end 

这在MASM中组装时没有错误。

生成的shellcode具有空值,并且与网站略有不同。它如下。

我用objdump -d nameofexecutable.exe得到反汇编。

Disassembly of section .text 
00401000 <.text>: 
    401000:  33 c0     xor %eax,%eax 
    401002:  bb 0e 10 40 00   mov $0x40100e,% 
    401007:  66 b8 88 13    mov $0x1388,%ax 
    40100b:  50      push %eax 
    40100c:  ff d3     call *%ebx 
    40100e:  ff 25 00 20 40 00  jmp *0x402000 

但在网站上,没有00十六进制代码。

Disassembly of section .text: 

08048080 <_start>: 
8048080:  31 c0     xor %eax,%eax 
8048082:  bb ea 1b e6 77   mov $0x77e61bea,%ebx 
8048087:  66 b8 88 13    mov $0x1388,%ax 
804808b:  50      push %eax 
804808c:  ff d3     call *%ebx 

难道是因为我使用x64编译或因为我间接调用函数吗?

任何帮助将不胜感激,谢谢。

+0

这也可能是由于MASM/NASM的版本差异。 – 2014-08-28 07:09:24

简单的答案是,MASM吸!

引用自here“以前我使用免费和开源的Netwide Assembler(NASM)开发了32位shellcode,但是当我通过学习64位变体的练习时,我发现我会尝试它(MASM),一个问题很快就变得明显:MASM没有办法(据我所知)生成原始的二进制机器代码,而不是.exe文件!尽管如此,所有代码字节都不会丢失很容易从.exe文件中提取出来(但将来我可能会回到NASM)。“,创建shellcode更加困难。

我用NASM来创建一个程序的shellcode,这个程序说你在windows x64上提供的链接,这是我实现的结果,没有空字节。原来睡眠示例可能无法正常工作,但第二个示例功能完全正常。

"\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x2f\x59\x88\x51\x0a" 
"\xbb\x82\xf8\x60\x77\x51\xff\xd3\xeb\x31\x59\x31\xd2" 
"\x88\x51\x0b\x51\x50\xbb\xe6\x4d\x61\x77\x59\x31\xd2" 
"\x88\x51\x03\x31\xd2\x52\x51\x51\x52\x31\x32\xd2\x50" 
"\xb8\xca\x3a\x61\x77\xe8\xcc\xff\xff\xff\x75\x73\x65" 
"\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xca\xff\xff\xff" 
"\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8" 
"\xc6\xff\xff\xff\x48\x65\x79\x4e" 

注:使用nameofexecutable.o与objdump的

即。 objdump -o nameofexecutable.o来获取shellcode而不是nameofexecutable.exe

您的代码被汇编运行在0x00401000,所以所有地址的最高字节最终为0x00。他们的代码被汇编运行在0x08048080,所以他们所有地址的最高字节都是0x08。

这就是你所有的零来自哪里。

+0

我发现你是如何得到十六进制代码和它在哪里运行,但有什么办法来解决NULL值? – David 2014-08-28 07:41:09

+0

@大卫你是什么意思“修复”?他们不会造成问题,是吗? – davmac 2014-08-28 08:30:50

+0

好吧,根据答案,他们是从0x00开始,他们正在导致NULL字节发生,所以我如何消除NULL字节? @davmac – David 2014-08-28 09:00:28