2016-12-01 60 views
0

我使用eicar.com文件并使用逆向工程工具进行游戏。我希望能够反汇编和重新组合这个文件。我接近了,但仍然存在一些我无法弄清楚的问题。拆卸和重新组装,如何在终端中正确管道?

这是原来的eicar.com ASCII文件。

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* 

使用udcli udcli -noff -nohex eicar.com > stage1.asm我结束了这个x86汇编

pop eax     
xor eax, 0x2550214f  
inc eax     
inc ecx     
push eax     
pop ebx     
xor al, 0x5c    
push eax     
pop edx     
pop eax     
xor eax, 0x5e502834  
sub [edi], esi   
inc ebx     
inc ebx     
sub [edi], esi   
jge 0x40     
inc ebp     
dec ecx     
inc ebx     
inc ecx     
push edx     
sub eax, 0x4e415453  
inc esp     
inc ecx     
push edx     
inc esp     
sub eax, 0x49544e41  
push esi     
dec ecx     
push edx     
push ebp     
push ebx     
sub eax, 0x54534554  
sub eax, 0x454c4946  
and [eax+ecx*2], esp  
sub ecx, [eax+0x2a] 

最后,使用此命令把它重新走到一起与nasmnasm stage1.asm -o stage2我结束了......

fXf5O!P%[email protected][4\fPfZfXf54(P^fg)7fCfCfg)7^O<8d>^R^@fEfIfCfAfRf- STANfDfAfRfDf-ANTIfVfIfRfUfSf-TESTf-FILEfg!$Hfg+H* 

在这种情况下,我将从一个ASCII文件开始,并以一个包含大量额外垃圾的bin文件结束。

我在这里错过了什么?我如何最终得到原始的ASCII字符串并且具有正确的文件类型?

编辑: Per @Ross Ridge的建议,他指出我正在拆分16位文件作为32位文件,它已成功清理了字符串,但是他的文件类型仍然被错误地输出为二进制文件。

首次定位:udcli -16 -noff -nohex eicar.com > stage1.asm,以获得正确的输出字符串。

结果X5O!P%@AP[4\PZX54(P^)7CC)7^O<8d>"^@EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

还是有点垃圾数据不存在于原始的,但非常接近。

+2

您将其拆分为32位代码并将其组装为16位代码。鉴于扩展名,你应该将其拆分为16位代码。 –

+0

@罗斯里奇你的权利!清理了字符串。我将编辑原始问题,但输出文件类型仍然不正确。我发现我可以用'nasm'明确地改变这个,但是我没有看到一个ASCII选项。是否有其他工具或步骤我应该考虑? –

+1

它看起来像你正在使用正确的输出文件类型与NASM,二进制文件类型。你可以用'-f bin'明确指定它。 ASCII文件是只包含ASCII字符的二进制文件,而您的源二进制文件“eicar.com”恰好只包含ASCII字符。 –

回答

3

一般来说,你不能重组一个伪君子的输出反馈到确切相同的二进制文件的原件。通常有多种方法将给定的汇编指令汇编到机器代码中。到目前为止,你理解代码的最终目标是你试图做到这一点,它也没有什么帮助。即使你确实得到了一些你可以重新组装成原始代码的东西,你也不太可能会得到一些你可以修改并组装成可用的代码的东西。

为了说明这一点,我已经提供了我自己的“反汇编”eicar.com文件,允许它在一定程度上进行修改。您可以修改它打印的字符串,只要该消息不是太长并且不包含任何美元符号$字符。假设您只将可打印的ASCII字符放在字符串中,您应该能够修改字符串,同时仍然保持输出只包含可打印的ASCII字符。

BITS 16 
    ORG  0x100 

ascii_shift EQU 0x097b 

start: 
    pop  ax 
    xor  ax, 0x2000 | (skip - start + 0x100) | 0x000f 
    push ax 
    and  ax, 0x4000 | (skip - start + 0x100) 
    push ax 
    pop  bx 
    xor  al, (msg - start)^(skip - start) 
    push ax 
    pop  dx 
    pop  ax 
    xor  ax, (0x2000 | (skip - start + 0x100) | 0x000f)^ascii_shift 
    push ax 
    pop  si 
    sub  [bx], si 
    inc  bx 
    inc  bx 
    sub  [bx], si 
    jnl  skip 

msg: 
    DB  'EICAR-STANDARD-ANTIVIRUS-TEST-FILE!' 
    DB  '$' 

%if ($ - msg) < 0x21 
    TIMES 0x21 - ($ - msg) DB '$' 
%endif 

skip: 
    DW  0x21cd + ascii_shift 
    DW  0x20cd + ascii_shift 

%if skip - msg > 0x7e 
%error 'msg too long' 
%endif 

我不会解释代码是如何工作的,但我会给你一个提示:MS-DOS推动堆叠在.COM格式的可执行开始执行一个16位的0值。

1

的问题是,反汇编使代码和数据之间没有差别。

声明本:

sub eax, 0x54534554  ; 'TEST' 
sub eax, 0x454c4946  ; 'FILE' 

(和所有的sub eax语句)

这是不是真的代码(这是没有意义从其减去这两个值无需在中间使用它们),这是一个部分消息(那里的第一个指令是TEST,然后FILE

因此,当你重新组装,可能会出现优化其破坏你的数据(sub可能是插补用不同的方式重新设置)。您必须确定数据部分,以便它们不被汇编程序视为代码。

另一种方法是关闭所有组装优化。

+0

“关闭所有组装优化“。我不会这样描述它(我认为汇编器的努力并不值得“优化”这个词,它更像是找到仍然适合源代码的最简单的操作码)......它更像是指定要组装的特定指令以某种特定的方式。这可能证明是相当困难的。例如,我很难想象如何执行'nasm'来产生'mov al,[ds:bx]'包括'ds'前缀操作码(除了mov al之前的明显的'db 0x3E',[bx ]来源)。但是反汇编器会合并它,我想。 – Ped7g

+0

是的,没有全局优化,只是指令优化:选择一个较短的操作数或做一些相当于保存指令周期的东西(如sub eax,eax为零eax) –