红队开发:让自己的Shellcode实现SMC
简介
SMC(Self Modifying Code)是一种代码变形技术,在程序正常运行的时候将杂乱的数据解密为可执行代码,来达到变形或对代码加密的目的,从而一定程度上躲过杀毒软件的查杀或者迷惑反病毒工作者对代码进行分析。SMC可用于软件加壳等技术,我们这里只从红队的角度,做一个简单的针对shellcode的smc工具。
流程
SMC必须具有一段bootstrap代码,也就是引导代码,用于定位shellcode并根据一定条件来解密shellcode,同时本身也可以作为shellcode,在内存中直接加载运行,大概原理以及过程,可以看看鄙人做的这个糙图:
代码
所以我们写SMC有几个关键点:
-
1. 要用汇编实现。 -
2. 需要定位真实的shellcode起始地址。 -
3. 要获取shellcode结束地址或者长度。 -
4. 解密shellcode,然后跳转执行。
我们需要把上述过程模板化,这样每次用的时候,只需要把我们的shellcode传递进来,然后转换smc stub汇编代码为opcode,添加在shellcode开头处,形成一段新的smc shellcode。
以64位汇编为例,首先我们需要找到shellcode起始的位置,这个怎么找呢?根据上图,shellcode起始位置其实就等于smc stub的起始位置加上smc stub的长度:
call get_eip jmp asm_main get_eip: mov rbx,[rsp] ret
我们通过一个巧妙的方式: 在调用一个函数后,rsp处保存的地址就是call之后的下一条指令的地址,这样我们就间接得到了 smc stub 中的一个地址,当然这个地址并不是精准的开头地址,起始是第二行代码的地址。
不过已经达到我们的目标,一个可以获取的绝对地址用来间接的查找shellcode。
找到shellcode还需要我们的smc stub长度,这个长度想一下,其实可以是固定的,因为一旦汇编写完之后,我们用keystone等汇编引擎转为opcode,转换后的opcode字节数目其实是固定长度,而且我们这里只用1个 byte的xor作为演示,所以大概代码就可以这样写:
asm_main: lea rax,[rbx+0x4a]
rbx保存了smc stub中的一个地址,这里的0x4a是我这边smc stub到shellcode的长度,这样一来rax中就保存了shellcode的起始位置。解密还需要一个shellcode的长度,这个很好弄啊。只需要在stub前面加一行汇编,把shellcode的长度保存在rcx中,后续去rcx中获取长度即可:
mov rcx,shellcodelen
然后是解密过程,我们需要不断的移动我们的地址,从shellcode开始位置,一个字节一个字节往后移动,直到移动的次数等于我们的shellcode长度为主,我们这里以xor最简单的方式实现,xor的也可以在模板化过程中通过你的代码传递,比如格式化字符串:
xor rsi,rsidecode: mov rdi,[rax] xor rdi,{key1} mov [rax],rdi add rax, 1 inc rsi cmp rsi,rcx jl decode
注意这是一个不断循环的过程,rsi所谓索引计数器,需要不断的去比较是否等于rcx也就是shellcode长度,如果等于,说明我们的解密过程结束了,然后执行一个jmp shellcode地址就可以了。
结束
我们可以把上述过程封装一下,并且给他做一个UI框架,用的时候只需要把shellcode文件拖进去,一键搞定即可,你也可以自己设计更加复杂的算法机制,这考验你的汇编能力了。
原理讲解:
https://www.bilibili.com/video/BV1pswAe3EYs
工具以及代码👇:
这是一个纯粹,开放,前沿的技术交流社区,成员主要有互联网大厂安全部门任职的成员,乙方红队专家,以及正在学习入门的小白等,目前主题主要以红队研发为主(有经验的都知道是什么意思),以及其他涉及到红队进攻侵入性技术,如果你想学习技术,认识不同的人或者寻求一个机会之类的,可以来看看👇👇👇
欢迎加入交流圈
扫码获取更多精彩
原文始发于微信公众号(黑晶):红队开发:让自己的Shellcode实现SMC
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论