Security 内联运行简短的asm脚本进行动态分析

Security 内联运行简短的asm脚本进行动态分析,security,assembly,x86,reverse-engineering,malware,Security,Assembly,X86,Reverse Engineering,Malware,有什么好的理由不直接在我的笔记本电脑上运行usermode c程序内联的未知(30行)汇编脚本进行动态分析吗 只有一个对time的系统调用,此时我可以看出它是一个函数,它接受一个c字符串和它的长度,并在循环中对它执行某种加密,只要length参数告诉它,它就只遍历字符串 我知道这个脚本(应该是)来自一段恶意代码,但就我的一生而言,我想不出任何方法可以阻止我的计算机出现某种硬件错误(这似乎不太可能,因为循环大约有7条指令长,整个脚本中最奇怪的指令是shr) 我知道直接在金属上运行一段未知的汇编代码

有什么好的理由不直接在我的笔记本电脑上运行usermode c程序内联的未知(30行)汇编脚本进行动态分析吗

只有一个对time的系统调用,此时我可以看出它是一个函数,它接受一个c字符串和它的长度,并在循环中对它执行某种加密,只要length参数告诉它,它就只遍历字符串

我知道这个脚本(应该是)来自一段恶意代码,但就我的一生而言,我想不出任何方法可以阻止我的计算机出现某种硬件错误(这似乎不太可能,因为循环大约有7条指令长,整个脚本中最奇怪的指令是shr)


我知道直接在金属上运行一段未知的汇编代码听起来很糟糕,但考虑到目前为止我的分析,我想不出有什么办法可以让它咬我或逃脱。

您可以使用它轻松地模拟CPU(如果支持该体系结构),并在没有任何风险的情况下使用外壳代码。

是的,你可以,但我不推荐。
问题不在于这次代码有多危险(假设您真的理解所有代码,并且可以预测任何系统调用的结果),问题在于这是一个滑坡,考虑到风险,不值得这么做

我已经做了很多恶意软件分析,很少有一段代码让我措手不及,但它确实发生了。
幸运的是,我在一个隔离网络中的虚拟机上工作:我刚刚恢复了最后一个快照,并更仔细地处理了代码。
如果你在你真正的机器上做这个分析,你可能会养成这个习惯,总有一天它会反过来咬你。
使用虚拟机虽然不如使用操作系统本机GUI那么舒适,但这是一条可行之路

运行7行汇编代码段会出现什么问题?
我不知道,这取决于代码,但有几件事需要注意:

  • 例外情况。指令可能会故意出错,以将控件传递给异常处理程序。这就是为什么完全理解代码非常重要的原因:指令和数据
  • 系统调用漏洞攻击。精心编制的系统调用输入可能会触发系统中的0天漏洞或未修补漏洞。这就是为什么可以预测每个系统调用的结果很重要
  • 反调试器技术。有很多方法可以让一段代码逃脱调试器(我认为这里是Windows调试),很难记住它们,对所有事情都心存怀疑 我刚刚列举了一些,一个硬件错误可能导致特权代码执行,这是灾难性的,但如果这真的是一种可能性,那么除了一台备用的神圣机器之外,什么也做不了

    最后,如果您要在机器上的断点处运行恶意软件(因为我假设提取代码及其上下文的工作负担太重),请考虑风险所在。 如果将断点放在错误的位置,如果恶意软件采用另一条路径,或者调试器有一个故障GUI,则可能会丢失数据或泄露计算机的机密性。
    我认为这不值得


    出于普遍性的考虑,我不得不提出这个前提,但我们都犯了一些罪,不是吗?
    我从来没有在我的机器上运行过恶意软件,但我已经通过直接连接到公司网络上的虚拟机运行过一些。
    这是一次有控制的行动,没有发生任何事情,有能力的人员得到了建议,这是一个圆满的结局。
    这很可能就是你的情况:它可能只是一个解密算法,而不是别的。
    但是,只有您才有最终责任判断是否可以运行该段代码。
    正如我在上面所说的,一般来说,这不是一个好主意,它假定您真正理解代码(这是一件很难做到并且很诚实的事情)。
    如果你认为这些先决条件都满足了,那就去做吧

    在此之前,我会:

  • 创建一个无特权的用户,并拒绝其访问我的数据和公用文件夹(理想情况下,拒绝其访问所有内容,但不包括使程序工作所必需的内容)
  • 备份关键数据(如果有)
  • 选择性地

  • 创建一个恢复点
  • 对系统文件夹、已安装服务的列表和常用启动注册表项的值进行散列(Sysinternals有一个工具可以枚举它们)
  • 分析完成后,您可以检查系统范围内没有任何重要的更改。
    subst
    一个文件夹并将恶意软件放在那里,以便虚拟路径遍历在该文件夹中停止,这可能会有所帮助


    难道没有更好的解决方案吗?
    我喜欢将虚拟机用于快照功能,尽管您可能会遇到反虚拟机检查(但它们实际上是愚蠢的检查,因此很容易跳过它们)

    对于7行程序集,我只需将其重写为JS函数,并直接在浏览器控制台中运行它。
    您只需转换变量中的每个寄存器并转录代码,无需全局理解,只需局部理解(即每条指令)。
    如果您不需要处理64位的数量,那么JS非常方便,因为您面前有一个解释器:)
    或者,我使用我手头的任何编程语言(有一次甚至自行组装,这似乎很矛盾,但由于一个卑鄙的伎俩,我不得不将64位代码转换为32位代码,并用它修补恶意软件)