关于ShellCode混淆

发布于 2018-10-15  790 次阅读


最近在写shellcode混淆和我的一些想法
------------------------------------------
规则的组合问题
实际上完全不用手动写组合 (当然为了随机度够高和执行效率的兼容 可以写一些随机组合 且只混淆一次)
只要支持的指令足够 形态够多 混淆的次数增加 复杂程度指数级上升
此时IDA 已经很难对这时候的shellcode进行静态分析了
------------------------------------------
关于代码混淆保护我的一些想法
虽然和代码虚拟机差距很大,但是也能够起到一定的保护作用,当然如果混淆规则多实际上效果也很好。
混淆恐怖之处在于指令的二次变形。一条指令变形成多个。其中的一些指令又可以变形成为多种形式->循环往复其中的某些指令可以由若干条指令组合而成。
通俗点说 就是混淆后在混淆
--------------------------------------------------
当然最大的价值在于Anti基于指令的特征码扫描
例如
跟踪Hook式 指令扫描

--------------------------------------------------
call [reg+dsip]变形规则
--------------------------
call [rsp]大法 :
push reg //首先把reg base压入
add [rsp],imm//然后加上偏移 此时[rsp]为目标函数的指针
push reg
mov reg,[rsp+8] mov reg,[reg] mov [rsp+8],reg
pop reg
//此时[rsp]为目标函数
call [rsp] -----------------------------------
ret 大法
call $+5 EB 000000
//此处的栈顶是当前的地址 加上后续的指令 就可以压入返回地址了
add [rsp],oplen
//这里计算跳转的目标地址
push reg //首先把reg base压入
add [rsp],imm//然后加上偏移 此时[rsp]为目标函数的指针
push reg
mov reg,[rsp+8] mov reg,[reg] mov [rsp+8],reg
pop reg
<-----stack----->
retadr
targetadr
ret
-----------------------------------
jmp[rsp] 大法
call $+5 EB 000000
//此处的栈顶是当前的地址 加上后续的指令 就可以压入返回地址了
add [rsp],oplen
//这里计算跳转的目标地址
push reg //首先把reg base压入
add [rsp],imm//然后加上偏移 此时[rsp]为目标函数的指针
push reg
mov reg,[rsp+8] mov reg,[reg] mov [rsp+8],reg
pop reg
<-----stack----->
targetadr
retadr
jmp [rsp+8] add rsp,8//平衡堆栈
-------------------------------------------

ret 大法2
call $+5 EB 000000
//此处的栈顶是当前的地址 加上后续的指令 就可以压入返回地址了
add [rsp],oplen
//这里计算跳转的目标地址
push reg //首先把reg base压入
add [rsp],imm//然后加上偏移 此时[rsp]为目标函数的指针
push reg
push reg2
mov reg,rsp
add reg,16 ;
mov reg,[reg];//拿到了函数地址了
mov reg2,rsp
add reg2,16 ;
mov [reg2],reg
pop reg2
pop reg
<-----stack----->
retadr
targetadr
ret

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

博客管理员