所以我最近阅读了 [1],它评估了几个反汇编程序。真值/测试二进制文件由 SPEC CPU 2006 基准套件生成。作者为 VirtualBox 内的 ELF 集提供了详细的构建说明。
然而,重建 Windows 二进制文件对我来说似乎是不可能的,因为作者没有提供用于构建这些二进制文件的 SPEC 配置文件。因此,使用 Visual Studio 2015 构建二进制文件(实际上与提供的映射文件 [2] 匹配)不起作用(暴力破解/猜测编译设置)。
例如,大多数样本“SPEC/vs15-32/C++”和“SPEC/vs15-32/C”都有以下.text库的序言(属性描述见附录):
[2]
@0x0000000000401000: [FBIC]
@0x0000000000401001: [IC]C
@0x0000000000401003: [IC]CC
@0x0000000000401006: [IC]
@0x0000000000401007: [IC]
@0x0000000000401008: [IC]CC
@0x000000000040100b: [IC]C
@0x000000000040100d: [JIC]C
所有 64 位样本都有以下序言:
<Segment .text, vaddr 0x0000000000001000, size 1600112, flag [RX]>
@0x0000000140001000: [FBIC]CCCC
@0x0000000140001005: [IC]CCCC
@0x000000014000100a: [IC]
@0x000000014000100b: [IC]CCC
@0x000000014000100f: [IC]CC
@0x0000000140001012: [IC]CC
@0x0000000140001015: [IC]CC
@0x0000000140001018: [JIC]C
我使用 VS2015 编译器和 intel 编译器为 SPEC 构建指令尝试了几种配置。但是,检查所有生成的二进制文件与 [1] 提供的基本事实不匹配。
所以有两个具体的问题:
当所有样本共享相似的 .text 序言时,它们都共享相似的库?
有人可以通过重复的序言推断编译细节吗?
属性说明:
d - data
c - code
i - instruction boundary
Note that if a byte is an instruction boundary (start of an instruction),
this implies that it is a code byte
o - instruction boundary (start of overlapping instruction)
b - basic block start
Basic block boundaries are not always explicitly listed, as they can usually
be found by parsing the instruction/function listing into a control-flow graph
f - function start
e - program/binary entry point
r - function end (return, tail call, etc.)
j - control-flow instruction (jmp, call, ret, ...)
x - crossref/call instruction
n - NOP or other function padding
[1] Dennis Andriesse 对全尺寸 x86/x64 二进制文件的反汇编的深入分析:
Zeus 是一个凭证窃取木马家族,最初出现在 2007 年。Zeus 的前两个变种基于集中式命令服务器。这些命令服务器现在经常被安全社区跟踪和阻止。显然,为了抵御这些常规反措施,Zeus 的第二个版本于 2011 年 9 月分叉为点对点变体。与 Zeus 的早期版本相比,这种点对点变体从根本上更难以禁用。通过对这个新的 Zeus 变体的详细分析,我们展示了最先进的点对点僵尸网络的高弹性,特别是点对点 Zeus。