0x01 为何编码
- 字符集的差异
- 应用程序应用平台的不同,可能的字符集会有差异,限制exploit的稳定性。
- 绕过坏字符
- 针对某个应用,可能对某些”坏字符“变形或者截断,破坏exploit。
- 绕过安全防护检测
- 有很多安全检测工具是根据漏洞相应的exploit脚本特征做的检测,所以变形exploit在一定程度上可以”免杀“。
0x02 如何编码
- 简单的加解密
- 用一段小巧的(以便可以在有限的字符集下实现)的代码加解密真正的shellcode。
- alpha2/3编译器
- 基于特定的reg为基地址,指向shellcode起始处,就可以生成特定字符集的编码shellcode,用途很广泛。
- custom decoder
- 一种用计算的方式产生可见字符形式的code,并压入栈上执行。
0x03 编码实现
-
##### custom decoder
-
以4bytes的代码为一个片段(DWORD),这是在32bits下,在64bits下可以以QWORD为一个片段。通过计算产生一个片段。如opcode
push edx = x52 pop eax = x58 jmp edx = xffxe2
-
在内存中就是'\x52\x58\xff\xe2',DWORD表示就是0xe2ff5852。我们如果计算得到0xe2ff5852也就可以得到相应的opcode。
-
计算原则,用到的计算数必须也是可见字符,最好只包含字母数字。
- 数字范围0x30 - 0x39,字母范围0x41-0x5a, 0x61 - 0x7a。
-
计算方式
-
先得到原始DWORD的相反数re_opcode。
0 - 0xe2ff0000 = 0x1d010000,(有一个1溢出)
-
因此,我们用0减去re_opcode,就可以得到opcode,为什么用减法而不是加法直接得到opecode呢,以eax为例,sub eax, xx指令是‘\x2d'合法的,而add eax, xx是”\x81\xC0“。
-
那么目的就很明确了,我们需要用0减去几个和为re_opcode的数得到opcode,一般是3个比较容易以可见字符组合起来。
-
以上re_opcode为例。
0x1d010000 = 0x5F555555 + 0x5F555555 + 0x5e555556
- 如何找到这样的组合呢
-
-