运行 用于动态分析的简短 asm 脚本内联

Running a brief asm script inline for dynamic analysis

有什么好的理由不直接在我的笔记本电脑上 运行 一个简短的未知(30 行)汇编脚本内嵌在用户模式 ​​c 程序中以进行动态分析?

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

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

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

您可以使用 Unicorn 轻松模拟 CPU(如果架构受支持)并毫无风险地使用您的 shellcode。

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

我做了很多恶意软件分析,很少发生一段代码让我措手不及,但 它发生了
幸运的是,我在一个隔离网络中的虚拟机上工作:我刚刚恢复了最后一个快照并更仔细地逐步执行了代码。
如果您在真机上进行此分析,您可能会养成习惯,有一天这会反噬您。
使用 VM,虽然不像使用 OS 本机 GUI 那样舒服,但也是可行的方法。

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

  1. 例外情况。一条指令可能故意错误地将控制权传递给异常处理程序。这就是为什么您 完全 理解代码 非常 重要:指令和数据。
  2. 系统调用漏洞。对系统调用的特制输入可能会在您的系统中触发 0-day 或未修补的漏洞。这就是为什么您可以预测每个系统调用的结果很重要。
  3. 反调试器技术。有很多 一段代码可以逃脱调试器的方式(我想Windows 在这里调试),很难记住它们,对一切都持怀疑态度。

我只是列举了一些,硬件错误可能导致特权代码执行是灾难性的,但如果这真的有可能,那么除了一台备用的可牺牲机器之外别无他法。

最后,如果你要 运行 恶意软件(因为我认为提取代码及其上下文的工作负担太大)到你机器上的断点,想想有什么利害关系。 如果您将断点放在错误的位置,如果恶意软件采取了另一条路径,或者如果调试器的 GUI 有问题,您可能会丢失数据或机器的机密性。
我觉得不值得。


为了概括起见,我不得不做这个前提,但我们都会犯错,不是吗?
我的机器上从未 运行 遇到过恶意软件,但我已经通过直接连接到公司网络的虚拟机解决了一些问题。
这是一个受控的举动,没有发生任何事情,主管人员得到了建议,这是一个圆满的结局。
这很可能是你的情况:它可以只是一个解密算法,仅此而已。
但是,只有您有最终的责任来判断 运行 这段代码是否可以接受。
正如我上面所说的,一般来说这不是一个好主意,它假定你真的理解代码(这是很难做到并且诚实的事情)。
如果您认为这些先决条件都已满足,那么继续做吧

在那之前我会:

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

可选

  1. 创建还原点。
  2. 获取系统文件夹的哈希值、已安装服务的列表和常用启动注册表项的值(Sysinternals 有一个工具可以枚举它们)。

分析后,您可以检查系统范围内没有任何重要的更改。
subst 一个文件夹并将恶意软件放在那里可能会有所帮助,这样虚拟路径遍历就会停止在该文件夹中。


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

对于 7 行程序集,我只是将其重写为 JS 函数,然后 运行 直接在浏览器控制台中将其重写。
您可以简单地将每个寄存器转换为一个变量并转录代码,您不需要全局理解它而只需要局部理解它(即每条指令)。
如果您不必使用 64 位数量,那么 JS 很方便,因为您现在面前有一个解释器:)
或者我使用我手头的任何编程语言(有一次甚至自己组装它,这看起来很矛盾但是由于一个讨厌的技巧我不得不将一段 64 位代码转换为 32 位代码并用它修补恶意软件).