Rust程序逆向¶
REVERSE · 知识域。Rust 编译二进制的还原。标签:Rust程序符号恢复、其他Rust程序逆向。
触发特征¶
- panic 字符串("index out of bounds"、"called
Option::unwrap()on aNonevalue")、RUST_BACKTRACE提示、符号带17h哈希后缀。
Rust程序符号恢复¶
- demangle:
rustfilt/rust-demangle还原_ZN...17h...E格式符号。 - 未 strip 的二进制:crate 路径(
core::/std::/alloc::)+ crate 内部函数直接可读;main 逻辑通常在chall::main。 - strip 后:panic 字符串关联定位(panic 信息含源文件路径与函数!)——Rust panic 内嵌 file!()/line!() 宏展开,strip 也常留源文件名,是定位关键。
- 常量提取:
xmmword大常量块(Rust 优化后常量向量),IDAPython 脚本辅助(Insomnihack 2019)。
其他Rust程序逆向¶
- 语义还原要点:
Option/Result:判别联合(枚举 niche 优化,指针低位/空指针表示 None)。- 迭代器:零成本抽象,反编译常"消失"成循环;
collect/zip/chain模式识别。 - 所有权:大量 memcpy 是移动语义,非数据复制。
- String/&str:栈上 fat pointer(ptr,len)。
- serde_json schema 恢复:从 Deserialize 派生代码还原 JSON 字段结构(结构体 ↔ 字符串常量表)。
- 加密 crate 识别:aes/ring/chacha20 crate 符号;魔数常量同 C(→ 加密与解密)。
- 混淆对抗:release 优化 + LTO 后内联爆炸 → 按 panic/字符串锚点切块。
- 特殊利用面(pwn/reverse 交叉):
- 编译器 #25860 生命周期逃逸(Hack.lu 2018)。
#[no_mangle]覆写 libc 符号绕 seccomp(Hack.lu 2018)。- Rust 前端 PWN:panic unwrap 后的 UB 场景(unsafe 块)。
- WASM 出品:Rust→wasm(→ 可执行文件逆向 WASM 节)。
工具速查¶
rustfilt < 符号表
strings ./chall | grep "src/" # panic 泄露的源文件路径
# IDA:启用 demangle(Rust); cargo 符号: nm -C