我正在学习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.
程序工作正常并显示消息框,现在我运行了objdump -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取回可执行文件,该线程为here。我需要仅使用我在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
如果只给出十六进制代码,我如何取回可执行文件?
答案 0 :(得分: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
这将产生一个绝对地址(“call”使用相对的地址),所以当翻译成十六进制代码时,文件将如下所示:
db 0b9h
dd MessageBoxA@16
db 0ffh, 0d1h
答案 1 :(得分:0)
我非常肯定masm
有一个行长度限制(内存为255,至少对于我使用的版本而言)。
你需要将那个大的鸣笛db
语句拆分成多个语句。换句话说,做一些事情(你也会注意到我已经将内容更改为我的peferred风格 - 我不知道masm
是否接受C风格的十六进制数字,我从未使用过它们:< / p>
.code
start:
db 0b8h, 00h, 00h, 00h, 00h, 50h, 0ebh, 0fh
db 5bh, 53h, 53h, 50h, 0e8h, 1bh, 00h, 00h
; and so on
但是,我并非完全确信对MessageBox
和ExitProcess
的外部调用将与基于字节的解决方案一起使用,您需要检查