0

我正在学习 Windows 汇编语言masm作为我的汇编器和link链接器。我拿了以下汇编代码并获得了exe

.386                                                                                 
.model flat, stdcall                                                                 
option casemap :none                                                                 

extrn MessageBoxA@16 : PROC                                                          
extrn ExitProcess@4  : PROC                                                          

.code                                                                                
start:                                                                               
        mov eax, 0                                                                   
        push eax                                                                     
        jmp msg                                                                      
pgm:    pop ebx                                                                      
        push ebx                                                                     
        push ebx                                                                     
        push eax                                                                     
        call MessageBoxA@16                                                          
        push eax                                                                     
        call ExitProcess@4                                                           
msg:    call pgm                                                                     
        db "KingKong",0                                                              
end start

C:\Arena>ml /c /coff  a.asm                                                         
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: a.asm   

C:\Arena>link /subsystem:windows /defaultlib:kernel32 /defaultlib:user32 a.obj      
Microsoft (R) Incremental Linker Version 10.00.30319.01                             
Copyright (C) Microsoft Corporation.  All rights reserved. 

该程序运行良好并显示消息框,现在我运行 aobjdump -d a.exe并获取 shellcode 并将其插入回来以获取可执行文件

.386
.model flat, stdcall
option casemap :none

extrn MessageBoxA@16 : PROC
extrn ExitProcess@4  : PROC

.code
start:
db 0xb8,0x00,0x00,0x00,0x00,0x50,0xeb,0x0f,0x5b,0x53,0x53,0x50,0xe8,0x1b,0x00,0x00,0x00,0x50,0xe8,0x0f,0x00,0x00,0x00,0xe8,0xec,0xff,0xff,0xff,0x4b,0x69,0x6e,0x67,0x4b,0x6f,0x6e,0x67,0x00,0xcc,0xff,0x25,0x00,0x20,0x40,0x00,0xff,0x25,0x08,0x20,0x40,0x00
end start

但是当我尝试组装它时,我得到了

C:\Arena>ml /c /coff b.asm                                                          
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: b.asm                                                                  
b.asm(10) : error A2042:statement too complex 

我能够在 linux 上使用 hexdump 取回可执行文件,并且该线程在这里。我现在只需要使用我在 Windows 上获得的 hexdump 来取回可执行文件。我该怎么做 ?

编辑拆分字节是一个很好的建议,我有

.386                                                                                 
.model flat, stdcall                                                                 
option casemap :none                                                                 

extrn MessageBoxA@16 : PROC                                                          
extrn ExitProcess@4  : PROC                                                          

.code                                                                                
start:                                                                               
db 0xb8,0x00,0x00,0x00,0x00,0x50,0xeb,0x0f                                           
db 0x5b,0x53,0x53,0x50,0xe8,0x1b,0x00,0x00                                           
db 0x00,0x50,0xe8,0x0f,0x00,0x00,0x00,0xe8                                           
db 0xec,0xff,0xff,0xff,0x4b,0x69,0x6e,0x67                                           
db 0x4b,0x6f,0x6e,0x67,0x00,0xcc,0xff,0x25                                           
db 0x00,0x20,0x40,0x00,0xff,0x25,0x08,0x20                                           
db 0x40,0x00                                                                         
end start 

但是当我把它喂给汇编器时,我得到了

C:\Arena>ml a.asm                                                                   
Microsoft (R) Macro Assembler Version 10.00.30319.01                                
Copyright (C) Microsoft Corporation.  All rights reserved.                          

 Assembling: a.asm                                                                  
a.asm(10) : error A2206:missing operator in expression                              
a.asm(11) : error A2206:missing operator in expression                              
a.asm(12) : error A2206:missing operator in expression                              
a.asm(13) : error A2206:missing operator in expression                              
a.asm(14) : error A2206:missing operator in expression                              
a.asm(15) : error A2206:missing operator in expression                              
a.asm(16) : error A2206:missing operator in expression

仅给定十六进制代码,如何取回可执行文件?

4

2 回答 2

1

MessageBoxA 和 ExitProcess 的解决方法应该如下所示(不幸的是,我通常使用 GNU 汇编程序,所以我不知道这里的语法是否正确):

  db 0b8h, 000h, 000h, 000h, 000h, 050h, 0ebh, 00fh
  db 05bh, 053h, 053h, 050h, 0e8h
  dd MessageBoxA@16 - addr1
addr1:
  db 050h, 0e8h
  dd ExitProcess@4 - addr2
addr2:
  db 0e8h, 0ech, 0ffh, 0ffh, 0ffh, 04bh, 069h, 06eh
...

你不能“只”使用十六进制。当您不知道您调用的函数的地址时编写代码!

也许 MASM 甚至不允许使用“dd”伪指令创建相对地址。在这种情况下,您有一种可能性:

mov ECX, MessageBoxA@16
call ECX

这将产生一个绝对地址(“调用”使用相对地址),因此当转换为十六进制代码时,文件将如下所示:

db 0b9h
dd MessageBoxA@16
db 0ffh, 0d1h
于 2013-08-28T18:41:30.773 回答
0

我很确定masm有一个行长限制(内存中的 255,至少对于我使用的版本)。

您需要将那个大喇叭db声明分成多个。换句话说,做类似的事情(你还会注意到我已经将内容更改为我喜欢的风格 - 我不知道是否masm接受 C 风格的十六进制数字,我从未使用过它们):

.code
start:
    db 0b8h,  00h,  00h,  00h,  00h,  50h, 0ebh,  0fh
    db  5bh,  53h,  53h,  50h, 0e8h,  1bh,  00h,  00h
    ; and so on

但是,我并不完全相信外部调用将MessageBoxExitProcess基于字节的解决方案一起使用,您需要检查一下。

于 2013-08-28T07:35:14.270 回答