【问题标题】:Is there a difference between MASM shellcode and NASM shellcodeMASM shellcode 和 NASM shellcode 有区别吗
【发布时间】:2014-10-21 22:33:00
【问题描述】:

我是 StackOverflow 的新手。最近,我开始学习汇编,对汇编还很陌生,对 shellcode 完全陌生。我正在使用 RadAsm 使用 MASM 汇编器进行编译,我尝试从这个网站上学习 shellcode Shellcoding for Linux and Windows

我在 64 位 Windows 上使用 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/NASM版本不同。

标签: assembly nasm masm shellcode


【解决方案1】:

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

这是你所有零的来源。

【讨论】:

  • 我找到了你是如何得到十六进制代码的以及它在哪里运行,但是有没有办法修复 NULL 值?
  • @David “修复”是什么意思?它们不会造成问题,是吗?
  • 好吧,根据答案,它们从 0x00 开始,它们导致出现 NULL 字节,那么我怎样才能消除 NULL 字节? @davmac
  • 为什么要消除所有“NULL”字节?任何非平凡的程序都会有它们。
  • @RossRidge,我很想制作 shellcode,它不应该有 NULL 字节。
【解决方案2】:

简单的答案是 MASM 很烂!!

引用自here“过去我使用免费和开源的 Netwide Assembler (NASM) 开发了 32 位 shellcode,但在学习 64 位变体的练习时,我想我会尝试使用 Microsoft 汇编程序 (MASM) 代替它。一个问题很快就变得明显:MASM 无法(据我所知)生成原始二进制机器代码而不是 .exe 文件!不过,代码字节并没有丢失可以很容易地从 .exe 文件中提取(但将来我可能会回到 NASM)。”,创建 shellcode 更难。

我使用 NASM 为一个程序创建了 shellcode,该程序从您在 windows x64 上提供的链接中显示嘿,这是我实现的结果,没有空字节。结果证明 sleep 的示例可能无法正常工作,但第二个示例功能齐全。

"\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

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 2020-09-03
    • 1970-01-01
    • 2018-04-19
    • 2016-03-10
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多