汇编 – MASM shellcode和NASM shellcode之间是否存在差异

我是StackOverflow的新手.最近,我开始研究汇编,对于汇编来说还是一个新手,对shellcode来说是全新的.我正在使用RadAsm使用MASM汇编程序进行编译,我尝试从这个网站Shellcoding for Linux and Windows学习shellcode

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

这是我在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编译或因为我间接调用函数?

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

最佳答案
简单的答案是MASM很糟糕!

引用自here“过去我使用免费和开源的Netwide Assembler(NASM)开发了32位shellcode,但是当我学习64位变体时,我想我会尝试使用Microsoft汇编程序(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

转载注明原文:汇编 – MASM shellcode和NASM shellcode之间是否存在差异 - 代码日志