0x00 引言
ShellCode实际上可以理解为是一个函数,他可以是在溢出攻击中需要被异常执行的函数,他可以是注入攻击中需要被热更新的hook函数,他甚至可以是恶意进程中需要被执行的核心函数。
ShellCode之所以包含Shell这个关键字,因为在正规的入侵链中,黑客通常需要目标机器执行ShellCode以得到其终端。此Shell既可以是目标机器本地Shell,也可以是反弹到攻击机器的远程Shell。
ShellCode通常有以下三种存在形式: C生成的ELF文件、汇编生成的.asm文件以及纯十六进制的.bin文件。
而黑客偏爱十六进制ShellCode的原因,就是希望核心恶意代码既小又可执行(这允许它在尽可能广泛的情况下使用)。比如我们可以为他加壳、使他作为数据动态地加载到进程中,这样就更不容易被杀软发现。
0x01 ShellCode生成
由于目前能力有限,这边只介绍两种简单的纯十六进制ShellCode生成方法。
1 | 1 C/C++与objdump |
1、C/C++与objdump
objdump是一款linux下的反编译工具,下面以一个最简单的本地Shell获取代码为例介绍如何用该工具生成纯十六进制的ShellCode:
1 | /* test.cpp */ |
首先生成ELF文件,然后使用objdump生成ShellCode:
1 | # 生成ELF文件 |
2、ShellCode生成器
Github上可以找到ShellCode生成器,可以实现从C/C++代码生成汇编代码(.asm)或十六进制文件(.bin):
1 | # 写入源txt文件 |
0x02 ShellCode运行
为了测试上一步获取到的纯十六进制ShellCode的效果,除了直接使用上述生成器的’-t’参数,我们还可以直接写一个用于测试的.cpp文件:
1 | /* test.cpp */ |
上述的code变量即为生成的十六进制ShellCode,接下来测试其效果:
1 | # 生成ELF文件 |
0x03 ShellCode加密
对ShellCode加密的方式很多,比如代码混淆、加密算法、虚拟化等。
1 | 1 xor加密 |
1、xor加密
异或运算符’^’,可以用来判断两个值是否不同。
1 | 0 ^ 0 = 0 |
异或运算的特点是,如果对一个值连续做两次xor,则会返回这个值本身。
1 | # 1010异或后结果 |
上述这种特性使得它可以用于信息的加密。同样也意味着,可以加密我们的十六进制ShellCode:
1 |
|