我有一个混淆的二进制文件,它只打印一个简单的Hello World!
并像这样退出:
Hello World!
但是,当我查看带有 的程序集时objdump
,我找不到任何对printf
or 的调用write
,也找不到字符串Hello World!
。
0804840c <main>:
804840c: be 1e 84 04 08 mov $0x804841e,%esi
8048411: 89 f7 mov %esi,%edi
8048413: b9 26 00 00 00 mov $0x26,%ecx
8048418: ac lods %ds:(%esi),%al
8048419: 34 aa xor $0xaa,%al
804841b: aa stos %al,%es:(%edi)
804841c: e2 fa loop 8048418 <main+0xc>
804841e: 23 4f 29 and 0x29(%edi),%ecx
8048421: 46 inc %esi
8048422: ae scas %es:(%edi),%al
8048423: 29 4e 5a sub %ecx,0x5a(%esi)
8048426: 29 6e ae sub %ebp,-0x52(%esi)
8048429: c2 9c 2e ret $0x2e9c
804842c: ae scas %es:(%edi),%al
804842d: a2 42 17 54 55 mov %al,0x55541742
8048432: 55 push %ebp
8048433: 23 46 69 and 0x69(%esi),%eax
8048436: e2 cf loop 8048407 <frame_dummy+0x27>
8048438: c6 c6 c5 mov $0xc5,%dh
804843b: 8a fd mov %ch,%bh
804843d: c5 d8 c6 ce 8b vshufps $0x8b,%xmm6,%xmm4,%xmm1
8048442: a0 aa 90 90 90 mov 0x909090aa,%al
8048447: 90 nop
...
804844f: 90 nop
此处声称使用的混淆技术称为指令伪装(请参阅本文)。有人可以解释它是什么以及它是如何工作的吗?