以随机偏移量生成垃圾汇编代码

逆向工程 拆卸 部件 聚乙烯 x86-64
2021-07-01 22:52:51

最近在做一个项目。该项目的主要目的是生成静态无法检测的 PE 样本。每次生成 PE 样本时,每个生成的样本都将与前一个显着不同。我将使用shikata_ga_nai ( https://github.com/rapid7/metasploit-framework/blob/master/modules/encoders/x86/shikata_ga_nai.rb ) 来实现多态性。但是我目前正在努力改进垃圾组装生成. 创建垃圾程序集的可能性有很多。然而,包括 shikata_ga_nai 在内的大多数编码器在固定的相对位置生成垃圾汇编——这意味着垃圾指令被放置在代码的末尾或开头。无论如何,是否可以在代码中分散这些垃圾指令而不会弄乱条件/无条件jmpcall具有相对偏移量的指令?

为简单起见,以下程序集作为我的 PE 文件将要执行的代码的示例

有效载荷

0x42:   0F B7 2C 17             movzx   ebp, word ptr [rdi + rdx]
0x46:   8D 52 02                lea     edx, [rdx + 2]
0x49:   AD                      lodsd   eax, dword ptr [rsi]
0x4a:   81 3C 07 57 69 6E 45    cmp     dword ptr [rdi + rax], 0x456e6957
0x51:   75 EF                   jne     0x42

假设我要插入的垃圾指令是cmovne rsi, rsi. 如果我在代码的开头或结尾插入这条指令,它的逻辑不会改变。

但是,如果我cmovne rsi, rsicmp指令之前插入0x4a偏移量,当0x55将执行条件 jmp 指令时,它将跳过位于0x42->处的指令0x42: movzx ebp, word ptr [rdi + rdx]并在地址处开始执行0x46->lea edx, [rdx + 2]因为它试图 jmp 的偏移量是相对于rip.

旧偏移量-> 0x42+垃圾指令长度-> 0x4=新错误偏移量-> 0x46

垃圾填充有效载荷

0x42:   0F B7 2C 17             movzx   ebp, word ptr [rdi + rdx]
0x46:   8D 52 02                lea     edx, [rdx + 2]
0x49:   AD                      lodsd   eax, dword ptr [rsi]
0x4a:   48 0F 45 F6             cmovne  rsi, rsi
0x4e:   81 3C 07 57 69 6E 45    cmp     dword ptr [rdi + rax], 0x456e6957
0x55:   75 EF                   jne     0x46

有什么方法可以解决这个问题吗?

1个回答

汇编程序面临着类似的问题:用户编写文本标签,例如@loop,并在条件分支指令中引用它们,例如jbe @loop但是,汇编器不提前知道分支离标签有多远(以便为分支生成位移)。它仅在为其余指令生成机器代码后才知道。

怎么办?重新引入符号标签。不是将jneas表示jne 0x42- 直接在其内部具有地址 - 将其表示为jne top_of_loop. 然后,在添加垃圾指令后,计算从jneto的长度top_of_loop