拆卸和重新组装,如何在终端中正确管道?

时间:2016-12-01 22:32:49

标签: linux assembly nasm reverse-engineering

我正在使用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%f@fAfPf[4\fPfZfXf54(P^fg)7fCfCfg)7^O<8d>^R^@fEfIfCfAfRf- STANfDfAfRfDf-ANTIfVfIfRfUfSf-TESTf-FILEfg!$Hfg+H* 我最终会...

udcli -16 -noff -nohex eicar.com > stage1.asm

在这种情况下,我从一个ASCII文件开始,最后得到一个包含大量额外垃圾的bin文件。

我在这里缺少什么?如何使用原始ASCII字符串并使用正确的文件类型?

编辑: 根据@Ross Ridge的建议,他注意到我将一个16位文件拆解为32位文件,这已经成功清理了字符串,但是他的文件类型仍然错误地输出为二进制文件。

首先修复:X5O!P%@AP[4\PZX54(P^)7CC)7^O<8d>"^@EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*以获取正确的输出字符串。

package application; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; import javafx.scene.Parent; import javafx.scene.Scene; public class Main extends Application { @Override public void start(Stage primaryStage) { try { Parent root = FXMLLoader.load(getClass().getResource("application/anwendung.fxml")); primaryStage.setTitle("Benutzerverwaltung"); root.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(new Scene(root)); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } }

中的结果

还有一些垃圾数据不在原件中但非常接近。

2 个答案:

答案 0 :(得分: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 :(得分:1)

问题是反汇编程序在代码和数据之间没有区别。

请注意:

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

(以及所有sub eax语句)

这不是真正的代码(在没有使用它们的情况下减去两个值是没有意义的),这是消息的一部分(第一条指令中有TEST,然后是FILE

因此,当您重新组装它时,可能会发生破坏数据的优化(sub可能以不同的方式解释)。您必须识别数据部分,以便汇编程序不将它们视为代码。

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