JPCERTCC/rust-binary-analysis-research-en

GitHub: JPCERTCC/rust-binary-analysis-research-en

一份关于使用 Rust 编译的二进制文件进行逆向工程的研究报告,填补了相关技术知识积累的空白。

Stars: 25 | Forks: 0

# 使用 Rust 编译的二进制文件的逆向工程研究 ## 简介 Rust 是一种由 Mozilla 开发、目前作为 C 和 C++ 替代品而备受关注的编程语言。近年来,Rust 因其优秀的内存安全性和高性能而越来越被广泛采用。 然而,随着 Rust 作为编程语言的流行,使用 Rust 开发的恶意软件也呈增长趋势。Rust 恶意软件包括 SysJoker 变种和 BlackCat 勒索软件。 尽管如此,与使用其他语言开发的恶意软件相比,Rust 恶意软件的逆向工程技术和知识积累仍不充分。使用 Rust 等新语言编译的二进制文件具有不同于传统语言(如 C)编译的二进制文件的结构。这意味着我们需要采用不同于传统的方法和知识。 本报告总结了研究 Rust 二进制文件逆向工程所需知识的研究结果。 ## 本报告的预期读者 本报告假设读者具备以下工程师身份: * 恶意软件分析工程师 * 从事 Rust 二进制文件逆向工程的工程师 * 希望深入了解 Rust 内部结构的工程师 ## 研究环境 本研究中使用的 rustc 和 cargo 版本如下。编译在 Windows 上的 MSVC 环境中进行。 * cargo: 1.82.0 * rustc: 1.82.0 在反汇编二进制文件时,我们使用了 IDA Pro。所使用的 IDA Pro 版本如下: * IDA Pro v8.3.230608 ## 研究主题 本报告总结了以下项目的研究成果: | 编号 | 项目 | 概述 | | --- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | 1 | [与 Cargo 配置修改相关的二进制文件差异](1_profile.md) | 研究使用 cargo 减少二进制文件大小的方法在多大程度上可以减少体积,以及留下了哪些未移除的信息。这些方法应来自公开披露的信息。 | | 2 | [减小二进制文件大小](2_minimize_binary.md) | 研究使用 rustc 减少二进制文件大小的方法在多大程度上可以减少体积,以及留下了哪些未移除的信息。这些方法应来自公开披露的信息。 | | 3 | [识别 Rust 二进制文件](3_identify_rust_binary.md) | 研究用于判断二进制文件是否为 Rust 二进制文件的方法 | | 4 | [异常目录](4_exception_directory.md) | 研究从异常目录结构中可获得的信息 | | 5 | [TLS 目录](5_tls_directory.md) | 研究从 TLS 目录结构中获得的信息以及 TLS 回调的内容 | | 6 | [识别主函数和初始化](6_identify_main_function.md) | 识别用户定义主函数的方法 | | 7 | [字符串](7_strings.md) | 处理字符串的方法 | | 8 | [函数名重整](8_mangling.md) | 函数名重整的结构以及如何对重整后的函数名进行解重整 | | 9 | [闭包](9_closure.md) | 闭包的行为以及将要使用的内存布局 | | 10 | [枚举类型](10_enum.md) | 研究 Rust 中的枚举类型在汇编代码中的实现方式 | | 11 | [Match 语句](11_match.md) | 研究 Rust 中的 Match 语句在汇编代码中的实现方式 | | 12 | [Panic 语句](12_panic.md) | unwind 与 abort 两种 panic 行为在汇编代码中的差异 | | 13 | [迭代器](13_iterator.md) | 研究使用迭代器或 "next" 函数的代码在汇编代码中的实现方式 | | 14 | [特征](14_trait.md) | 使用特征调用函数与调用普通函数的差异 | 15 | [识别典型的特征](15_derive_attribute.md) | 识别 #\[derive] 属性在汇编代码中使用的特征的方法 | | 16 | [动态分派引用](16_dynamic_dispatch.md) | 使用动态与静态分派调用的汇编代码特性及差异 | | 17 | [集合](17_collection.md) | 所使用的内存布局 | | 18 | [识别由相同泛型生成的函数](18_generics_function.md) | 研究识别生成另一个函数的函数的方法 | | 19 | [智能指针](19_smart_pointer.md) | 智能指针的特性及内存布局 | | 20 | [内联汇编](20_inline_assembly.md) | 特征代码模式 | | 21 | [链接属性](21_link_attribute.md) | 链接库的方法差异 | | 22 | [Repr 属性](22_repr_attribute.md) | 研究根据指定选项内存布局如何变化 | | 23 | [如何识别标准库和第三方库中的代码](23_crates.md) | 识别静态链接的标准库和第三方库函数的方法 | ## 需求与修正请求 如果您有进一步的研究需求,或发现本报告中的错误,请通过 Issue 或 Pull Request 与我们联系。
标签:BlackCat 勒索软件, C/C++ 替代, DAST, IDA Pro, MSVC, Rust, Rust 恶意软件, Rust 逆向, SysJoker, URL提取, Windows 平台, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 内存安全, 反编译, 可视化界面, 恶意软件分析, 漏洞分析, 系统运维工具, 编程语言研究, 网络流量审计, 路径探测, 逆向工程, 静态分析, 高性能编程语言