2016-12-01 50 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) –