是否有充分的理由不在用户模式c程序中内联运行一个简短的未知(30行)汇编脚本,以便直接在我的笔记本电脑上进行动态分析?
对时间只有一个系统调用,在这一点上,我可以看出这是一个使用c字符串及其长度的函数,并在循环中对其执行某种加密,只要长度参数告诉它,它就只遍历字符串
我知道这个脚本(应该是)来自一段恶意代码,但就我而言,我想不出它有任何可能会在我的计算机上运行,除非出现某种硬件错误(考虑到循环大约有7个指令长,而整个脚本中最奇怪的指令是shr,这似乎不太可能)。
我知道直接在金属上运行一段未知的汇编代码听起来很糟糕,但考虑到我目前的分析,我想不出它会咬我或逃跑。
是的,你可以,但我不推荐。
问题不在于这次的代码有多危险(假设你真的了解所有代码,并且你可以预测任何系统调用的结果),问题是这是一个滑坡,考虑到利害关系,这是不值得的。
我做了很多恶意软件分析,很少有一段代码让我措手不及,但它发生了
幸运的是,我正在一个孤立网络中的虚拟机上工作:我刚刚恢复了最后一个快照,并更仔细地执行了代码
如果你在你的真实机器上进行分析,你可能会养成这个习惯,总有一天这会反噬你
使用虚拟机,尽管不如使用操作系统本机GUI舒适,但这是一条可行的道路。
运行一个7行的程序集片段会出现什么问题
我不知道,这真的取决于代码,但有几件事需要小心:
- 异常。指令可能会故意出错,将控制传递给异常处理程序。这就是为什么非常重要的是,您完全理解代码:指令和数据
- 系统调用漏洞利用。特制的系统调用输入可能会在系统中触发0天或未修补的漏洞。这就是为什么预测每个系统调用的结果很重要
- 反调试器技术。一段代码可以通过多种方式逃离调试器(我认为这里是Windows调试),很难记住所有这些,对一切都持怀疑态度
我刚刚列举了一些,硬件错误可能会导致特权代码执行,这是灾难性的,但如果这真的是可能的,那么除了一台备用的可牺牲机器什么都做不了。
最后,如果你要在你的机器上运行恶意软件(因为我认为提取代码及其上下文的工作负担太重)到断点,想想有什么利害关系。如果您将断点放置在错误的位置,如果恶意软件采用其他路径,或者调试器的GUI出现故障,则可能会丢失您的数据或计算机的机密性<我觉得我的意见不值得。>
为了通用性,我不得不提出这个前提,但我们都犯了一些罪,不是吗
我从来没有在我的机器上运行过恶意软件,但我已经通过了一些直接连接到公司网络上的虚拟机
这是一个有控制的举动,什么都没发生,主管人员得到了建议,结果是一个圆满的结局
这很可能是你的情况:它可能只是一个解密算法,仅此而已
但是,只有您有最终的责任来判断运行代码是否可以接受
正如我上面所说,一般来说,这不是一个好主意,而且它以你真正理解代码为前提(这很难做到,也很难诚实)
如果您认为这些先决条件都已满足,则继续执行。
在此之前,我会:
- 创建一个无特权用户,并拒绝它访问我的数据和公用文件夹(理想情况下,拒绝它访问除使程序正常工作所需的一切)
- 备份关键数据(如果有)
可选
- 创建一个恢复点
- 获取系统文件夹的散列、已安装服务的列表和常用启动注册表项的值(Sysinternals有一个工具可以枚举它们)
分析后,您可以检查系统范围内是否没有任何重要的更改
这可能有助于subst
一个文件夹,并将恶意软件放在那里,以便在该文件夹中停止虚拟路径遍历。
难道没有更好的解决方案吗
我喜欢使用虚拟机的快照功能,尽管您可能会遇到反虚拟机检查(但它们确实是愚蠢的检查,所以很容易跳过它们)。
对于7行程序集,我只需将其重写为JS函数,然后直接在浏览器控制台中运行
您可以简单地转换变量中的每个寄存器并转录代码,不需要全局理解,只需要局部理解(即每个指令)
JS很方便,如果你不必处理64位的数量,因为你现在有一个解释器:)
或者我可以使用手头的任何编程语言(有一次甚至是自己组装,这似乎很矛盾,但由于一个讨厌的技巧,我不得不将64位的代码转换为32位的代码,并用它修补恶意软件)。
您可以使用Unicorn轻松地模拟CPU(如果支持体系结构),并在没有任何风险的情况下使用shell代码。