拆卸和重新组装,如何在终端中正确地进行管道传输?
Disassembling and Reassembling, how to properly pipeline this in the terminal?
我正在使用 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]
最后,使用此命令将其与 nasm
放回原处,nasm stage1.asm -o stage2
我最终得到...
fXf5O!P%f@fAfPf[4\fPfZfXf54(P^fg)7fCfCfg)7^O<8d>^R^@fEfIfCfAfRf- STANfDfAfRfDf-ANTIfVfIfRfUfSf-TESTf-FILEfg!$Hfg+H*
在这种情况下,我从一个 ASCII 文件开始,以一个包含大量额外垃圾的 bin 文件结束。
我在这里错过了什么?如何获得原始 ASCII 字符串并获得正确的文件类型?
编辑:
根据@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*
还有一点垃圾数据,原始数据中没有,但非常接近。
问题是反汇编器对代码和数据没有区别。
注意这个:
sub eax, 0x54534554 ; 'TEST'
sub eax, 0x454c4946 ; 'FILE'
(以及所有 sub eax
语句)
这不是真正的代码(减去两个值而不在中间使用它们是没有意义的),这是消息的一部分(第一条指令中有 TEST
,然后是 FILE
)
因此,当您重新组装它时,可能会发生破坏数据的优化(sub
可以用不同的方式解释)。您必须识别数据部分,以免汇编程序将它们视为代码。
另一种方法是关闭所有汇编优化。
一般来说,您不能将反汇编程序的输出重新assemble 返回到与原始文件完全相同的二进制文件中。通常有不止一种方法可以将给定的汇编指令 assemble 转换为机器代码。就你理解代码的最终目标而言,你试图用它来做到这一点也不是很有帮助。即使您确实获得了可以 assemble 回到原始代码中的东西,您也极不可能获得可以修改的东西并 assemble 变成有效的代码。
为了说明这一点,我提供了我自己的 eicar.com
文件的 "disassembly",该文件允许对其进行有限程度的修改。您可以修改它打印的字符串,只要消息不太长并且不包含任何美元符号 $
字符即可。假设您只在字符串中放入可打印的 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 值压入堆栈。
我正在使用 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]
最后,使用此命令将其与 nasm
放回原处,nasm stage1.asm -o stage2
我最终得到...
fXf5O!P%f@fAfPf[4\fPfZfXf54(P^fg)7fCfCfg)7^O<8d>^R^@fEfIfCfAfRf- STANfDfAfRfDf-ANTIfVfIfRfUfSf-TESTf-FILEfg!$Hfg+H*
在这种情况下,我从一个 ASCII 文件开始,以一个包含大量额外垃圾的 bin 文件结束。
我在这里错过了什么?如何获得原始 ASCII 字符串并获得正确的文件类型?
编辑: 根据@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*
还有一点垃圾数据,原始数据中没有,但非常接近。
问题是反汇编器对代码和数据没有区别。
注意这个:
sub eax, 0x54534554 ; 'TEST'
sub eax, 0x454c4946 ; 'FILE'
(以及所有 sub eax
语句)
这不是真正的代码(减去两个值而不在中间使用它们是没有意义的),这是消息的一部分(第一条指令中有 TEST
,然后是 FILE
)
因此,当您重新组装它时,可能会发生破坏数据的优化(sub
可以用不同的方式解释)。您必须识别数据部分,以免汇编程序将它们视为代码。
另一种方法是关闭所有汇编优化。
一般来说,您不能将反汇编程序的输出重新assemble 返回到与原始文件完全相同的二进制文件中。通常有不止一种方法可以将给定的汇编指令 assemble 转换为机器代码。就你理解代码的最终目标而言,你试图用它来做到这一点也不是很有帮助。即使您确实获得了可以 assemble 回到原始代码中的东西,您也极不可能获得可以修改的东西并 assemble 变成有效的代码。
为了说明这一点,我提供了我自己的 eicar.com
文件的 "disassembly",该文件允许对其进行有限程度的修改。您可以修改它打印的字符串,只要消息不太长并且不包含任何美元符号 $
字符即可。假设您只在字符串中放入可打印的 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 值压入堆栈。