MASM shellcode和NASM shellcode是否有区别?

我是StackOverflow的新手。 最近,我开始研究汇编,而且对于汇编来说是相当新的,对于shellcode来说是全新的。 我正在使用RadAsm编译使用MASM汇编程序,我尝试从本网站Shellcoding for Linux和Windows学习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进行编译,或者是因为我间接调用了该函数?

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


简单的答案是,MASM吸!

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

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

"x31xc0x31xdbx31xc9x31xd2xebx2fx59x88x51x0a"
"xbbx82xf8x60x77x51xffxd3xebx31x59x31xd2"
"x88x51x0bx51x50xbbxe6x4dx61x77x59x31xd2"
"x88x51x03x31xd2x52x51x51x52x31x32xd2x50"
"xb8xcax3ax61x77xe8xccxffxffxffx75x73x65"
"x72x33x32x2ex64x6cx6cx4exe8xcaxffxffxff"
"x4dx65x73x73x61x67x65x42x6fx78x41x4exe8"
"xc6xffxffxffx48x65x79x4e"

注:与objdump一起使用nameofexecutable.o

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


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

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

链接地址: http://www.djcxy.com/p/86853.html

上一篇: Is there a difference between MASM shellcode and NASM shellcode

下一篇: Assembly GUI programming for Mac OS X