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

时间:2018-11-02 18:55:47

标签: security assembly x86 reverse-engineering malware

是否有充分的理由不直接在便携式计算机上的用户模式c程序中内联运行简短的未知(30行)汇编脚本来进行动态分析?

只有一个系统调用时间,在这一点上,我可以说它是一个函数,它使用ac字符串及其长度,并在循环中对其进行某种加密,该加密仅循环遍历字符串正如length参数所说明的那样。

我知道该脚本(应该是)来自一段恶意代码,但就我的一生而言,我想不出它会以何种方式阻止计算机出现某种硬件错误(这似乎是我的电脑)鉴于循环的长度约为7条指令,而整个脚本中最奇怪的一条指令是shr)。

我知道在金属上直接运行未知的汇编代码听起来很糟糕,但是鉴于我到目前为止的分析,我无法想到它会咬我或逃脱的任何方式。

2 个答案:

答案 0 :(得分:1)

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

我已经进行了很多恶意软件分析,并且很少有代码让我措手不及,但是它确实发生了
幸运的是,我正在隔离网络中的虚拟机上工作:我刚刚恢复了最后一个快照,并更仔细地逐步遍历了代码。
如果您是在实际计算机上进行此分析的,则可能会养成习惯,有一天,它会把您咬伤。
尽管不如使用操作系统本机GUI那样舒适,但使用VM仍是解决之道。

运行7行装配体代码片段会出现什么问题?
我不知道,它确实取决于代码,但要注意以下几点:

  1. 例外。一条指令可能会故意将控制权传递给异常处理程序。这就是为什么完全理解代码(指令和数据)非常非常重要的原因。
  2. 系统调用漏洞利用。系统调用的特制输入可能会触发系统中的0天漏洞或未修补的漏洞。这就是为什么预测每个系统调用的结果很重要的原因。
  3. 反调试器技术。 很多使得代码可以逃过调试器的方式(我在这里正在考虑Windows调试),很难记住全部内容,不要怀疑所有内容。

我仅举几例,硬件错误可能导致特权代码执行,这是灾难性的,但是如果确实有这种可能性,那么只有一台可牺牲的备用计算机将无济于事。

最后,如果您要运行恶意软件(因为我认为提取代码及其上下文的工作负担太大)到您的计算机上的断点,请考虑紧要关头< / em>。 如果将断点放置在错误的位置,恶意软件采用其他路径或调试器具有故障的GUI,则可能会丢失数据或计算机的机密性。
我认为这不值得。


为了通用起见,我必须为此做一个前提,但是我们都犯了罪,不是吗? 我从来没有在计算机上运行过恶意软件,但已经通过直接连接到公司网络的虚拟机逐步解决了一些恶意软件。
这是一个有控制的举动,什么也没发生,向主管人员提供了建议,结局很美。
这很可能是您的情况:它只能是解密算法,仅此而已。
但是,只有您有最终的责任来判断运行这段代码是否可以接受。
就像我在上面提到的那样,通常这不是一个好主意,它以您真正了解代码为前提(很难做并且很老实的事情)。
如果您认为这些先决条件都得到满足,请继续并执行

在此之前,我会:

  1. 创建一个没有特权的用户,并拒绝其访问我的数据和公用文件夹(理想情况下,拒绝一切,但使程序正常运行所需的一切)。
  2. 备份关键数据(如果有)。

可选

  1. 创建一个还原点。
  2. 对系统文件夹,已安装服务的列表以及常规启动注册表项的值进行哈希处理(Sysinternals有一个工具可以对它们全部进行枚举)。

分析之后,您可以检查整个系统范围内的重要内容是否都没有更改。
subst文件夹并将恶意软件放在此处可能会有所帮助,以便在该文件夹中停止虚拟路径遍历。


没有更好的解决方案吗?
我喜欢将VM用作快照功能,尽管您可能会偶然遇到反VM检查(但它们确实是愚蠢的检查,因此跳过它们很容易)。

对于7行程序集,我只需将其重写为JS函数并直接在浏览器控制台中运行即可。
您可以简单地将每个寄存器转换为变量并抄写代码,而无需全局地理解它,而只需要局部地了解(即每个指令)。
如果您不需要使用64位量,则JS很方便,因为您现在就拥有一个翻译器:)
另外,我也可以使用现有的任何编程语言(有时甚至可以自行进行汇编,这似乎很矛盾,但是由于一个令人讨厌的技巧,我不得不将64位代码段转换为32位代码段,并用它来修补恶意软件。 )。

答案 1 :(得分:0)

您可以使用Unicorn来轻松地仿真CPU(如果支持该体系结构),并在没有任何风险的情况下使用shellcode。