在逆向工程恶意软件/shellcode 时,哪些方法有用?

信息安全 恶意软件 逆向工程 外壳代码
2021-09-10 22:15:55

虽然我从技术角度熟悉逆向工程技术,但我从来没有找到一种很好的方法来处理和剖析恶意软件/shellcode。我找到了数百个关于分析恶意软件的技术方面的教程,但很少有关于实际方法的教程。

几个问题可以帮助您了解我在寻找什么:

  1. 你如何开始分析?您是从那里开始main并从那里展开,还是有更好的方法?
  2. 您如何找到和识别重要功能或您感兴趣的特定功能?
  3. 您如何绘制高级控制流?
  4. 您如何管理已确定的辅助例程?我觉得书签不够用,记事本太原始。
  5. 如何避免在汇编代码的雪崩中迷失方向?
  6. 处理此类任务的任何其他技巧/提示?
3个回答

你如何开始分析?您是从主要开始并从那里扩展,还是您有更好的方法?

从详尽的基本分析(动态和静态)开始 - 枚举导出、导入、函数使用、系统调用、winapi、互斥体、dll 依赖项、字符串和一些 grepping。对基本沙箱进行动态分析得出一些结论,虽然是局部的并且可能有些错误,但您现在可以对executable/dll的一些主要功能提出几个理论。

也就是说,如果我们谈论的是 java/.net 等——当然——反编译它们,但在这种环境中使用恶意软件并没有常见的做法。

如果你发现函数调用了一些可疑的东西——假设 exec 试图写入一些关键的系统文件/注册表值,或者部署奇怪的命名文件——你应该担心(或高兴,取决于你的帽子颜色:))

您如何找到和识别重要功能或您感兴趣的特定功能?

字符串很有帮助——你可以发现一些可疑的东西,比如以 cmd.exe 开头的字符串......甚至主机名、用户密码组合,以及其他资源黑客和依赖步行者是枚举导出、导入和包含的资源的基本工具。最重要的功能几乎总是必须在 IDA 或类似的静态分析工具中进行逆向工程。

您如何绘制高级控制流?

如果上述所有方法都失败了,IDA 的绘图功能非常好,可以用于它。

您如何管理已确定的辅助例程?我觉得书签不够用,记事本太原始。

IDA 有评论系统、着色选项、重命名等等。对于整个过程,我喜欢在需要时将事情绘制出来,这是最清晰的方法——即使在 visio 上也是如此。

如何避免在汇编代码的雪崩中迷失方向?

您几乎从未在 asm 级别上对所有可用代码进行工程改造。有些在动态分析方面效率更高(Olly 和 Immunity 很棒——Immunity 是一个有很多曲折的 Olly 分支),而且你永远不需要为了弄清楚它而反转所有代码。我在 IDA 中有一个颜色编码,并不断将已经反转的部分重命名为比“loc_402BBD”更合理的名称

处理此类任务的任何其他技巧/提示?

  1. 永远不要陷入一种思维状态,它会给你带来很多麻烦——想想分析代码几天,而不是得到一些完全改变你看待事物方式的部分,太可怕了。
  2. 练习,很多,没有什么比得上的,相信我。

我喜欢的一种方法是使用 API 监控软件。我最喜欢的是 Rohitab (google it) 的那个。我在监控对软件进行的 API 调用时调试有问题的恶意软件并逐步执行。这将为您提供有关恶意软件正在做什么的大量信息。例如:监视 FileRead 和 FileWrite 调用将让您知道恶意软件创建或读取了哪些文件。请注意,这在某种程度上是一种灰盒技术,而不是纯粹的逆向工程。虽然,如果您在 API 监视器中发现一些有趣的东西,您就会知道有趣的部分在程序集的哪个部分。

干杯。

广告 1:无论您如何开始,这都是偏好。通常您从 开始main(),因为如果您考虑实际单步执行代码,则没有其他选择。同样重要的是您的分析是什么意思,如果在这种情况下这是步进,main()是一个不错的选择。

广告 2:见广告 4。

广告3:如果是用汇编写的,最常见的是主块,会一一跳转到所有函数。如果它是用 C 语言编写的,那么还有一个以类似方式使用的 main 块,因为恶意软件通常是一小块软件。

广告 4:通过将所有地址标记为函数名称

广告 5:见广告 4

广告 6:您可以使用以下内容:

  • 反汇编程序自动标记对内核和操作系统库的所有调用,因此很清楚这些级别上发生了什么。
  • 执行代码的虚拟机 - qemu、wine 在这方面很有帮助。不是为了隔离,而是在无法使用调试器时以精确的方式跟踪恶意软件活动。KVM 也是不错的选择。
  • 识别代码片段及其功能,例如了解编译器和恶意软件作者的技术,有了这些知识,通过这些就容易多了。

一般来说,最难的部分是开始,但是一旦分析了主要部分,每隔一段代码就会变得更容易。通过了解各种编译器和语言以及它们生成机器代码的方式,它会变得容易得多。

此外,拥有代码片段和编译器机器代码输出的知识数据库也有很大帮助。这是一项漫长的任务,在没有框架的情况下做到这一点非常困难,特别是因为今天有这么多编译器(新版本),比以往任何时候都更难。