简单的活着

New Idea

Posted on By Mista Cai

技术思路

基于动态分析的反沙箱对抗技术

问题

环境敏感的逃逸技术,原则上只要有触发条件,可以找到触发条件使用的变量依赖于哪些环境敏感API,都是解决对象。

fuzzing

逃逸路径,往往在fuzzing里面也是难处理的magic bytes,重点获取这些种子,单独研究

07 污点+快照

不需要全部的代码覆盖,正常执行可以到达判定条件

VMRay Rewind

  • VMRay使用PT收集的信息判断程序的未执行代码区域
  • 对未执行区域进行过滤(丢弃异常处理)
  • 跟踪有趣条件分支
  • 利用符号执行,求解触发分支的解
  • 程序倒带回分支,注入求解进行另一个控制流的行为展开

  • 利用PT信息来确定被监视进程的内存dumps中的代码覆盖,即识别在分析期间尚未执行的所有代码位置。
  • 从这些未触发的代码位置,我们识别“有趣”函数的子集,例如,通过丢弃错误处理例程。
  • 然后,我们追溯从这些“有趣的”未执行代码位置到依赖于环境设置的先前条件分支(例如,获得当前时间或键盘布局的函数)的执行流程。
  • 然后应用符号执行来识别隐藏函数的路径(条件)。
  • 在这些路径上,我们使用求解器生成具体值以触发它们的执行。
  • 最后,我们重新分析示例并确保所有环境查询都会产生达到隐藏功能所需的值。

疑惑

每次获取替代分支之后都要调整环境重新触发隐藏功能? Y

  • 符号执行只是用来求解分支条件?Y,如果在分支点调用符号执行,没有前面的状态应该无法执行。

完整的执行可能包含10亿计的指令

实现

  • PT获取控制流信息,结合IDA Pro获取的控制流图,可以获得未执行的所有代码位置。参考S2E Coverage插件
    • 覆盖率查询
  • 从未执行的代码位置,向下搜索有趣函数子集,如果是Error-handling函数(一般会调用ExitProcess等),丢弃
void ExitProcess(
  UINT uExitCode
);
  • 向上搜寻cmp指令,关注依赖于环境设置的先前条件分支

过滤

在循环执行过程中,大比例进入错误处理代码块,

else {
  ERROR(”Invalid bytes”);
  ---
  return 0;
}

summary

两种思路求解替代路径的分支条件都面临相同问题:如果外界输入作为恶意代码的解密秘钥,即使符号执行能跑机密代码路径,也无法解密正确解(不知道key)。这个问题的难度在解密payload本身。