28 个稳定版本
1.0.28 | 2024 年 5 月 13 日 |
---|---|
1.0.27 | 2024 年 1 月 5 日 |
1.0.26 | 2023 年 11 月 19 日 |
1.0.23 | 2023 年 6 月 7 日 |
1.0.6 | 2021 年 11 月 27 日 |
#50 in 调试
1,870 每月下载量
380KB
9K SLoC
radius2 - 使用 r2 的快速符号执行
radius2
是一个使用 radare2
的快速符号执行和污点分析框架,专注于覆盖许多不同的架构和可执行格式。它还力求易于使用,并具有一个 CLI 工具,可以使一些逆向任务变得像添加符号值和设置字符串以到达或避免一样简单。像下面的示例一样,可以像解决逆向挑战一样容易。
$ radius2 -p ais3 -s flag 184 -X sorry
flag : "ais3{I_tak3_g00d_n0t3s}"
构建
使用以下命令安装 radare2:
git clone https://github.com/radareorg/radare2.git
radare2/sys/install.sh
使用以下命令安装 radius2:cargo install radius2
或将 radius2 作为依赖项使用 radius2 = "1.0.27"
支持的架构
- x86
- amd64
- ARM
- AArch64
“支持的”架构
radius2 还“支持” MIPS、PowerPC 和 Gameboy,但它们几乎完全没有经过测试。此外,radius2 支持执行 cBPF 和 eBPF 程序。
radius2 只能执行涉及静态方法和变量的 Dalvik 字节码。
最后,对 6502、8051、AVR、h8300、PIC、RISCV、SH-4、V810、V850、Xtensa 等也有不同程度的支持。
此外,可以使用 r2ghidra 中的 pdgp
将 PCode 转换为 ESIL(目前损坏,实际上可能已修复),因此可能可以通过这种方式支持更多的架构。
示例
use radius2::{Radius, Value};
fn main() {
let mut radius = Radius::new("tests/r100");
let mut state = radius.call_state(0x004006fd);
let addr: u64 = 0x100000;
let flag_val = state.symbolic_value("flag", 12 * 8);
state.memory_write_value(&Value::Concrete(addr, 0), &flag_val, 12);
state.registers.set("rdi", state.concrete_value(addr, 64));
radius.breakpoint(0x004007a1);
radius.avoid(&[0x00400790]);
let mut new_state = radius.run(state, 1).unwrap();
let flag = new_state.evaluate_string(&flag_val).unwrap();
println!("FLAG: {}", flag);
assert_eq!(flag, "Code_Talkers");
}
radius2 CLI 工具
radius2 也可以从 crates.io 安装,并轻松地包含在软件包中。radius2 还有一个 CLI 工具,可以使用以下命令安装:cargo install radius2
radius2 1.0.28
Austin Emmitt (@alkalinesec) <alkali@alkalinesecurity.com>
A symbolic execution tool using r2 and boolector
USAGE:
radius2 [FLAGS] [OPTIONS] --path <path>
FLAGS:
-M, --automerge Automatically merge states
-V, --color Use color output
--crash Execution stops on invalid memory access
-h, --help Prints help information
-j, --json Output JSON
-z, --lazy Evaluate symbolic PC values lazily
-K, --merge-all Merge all finished states
--no-sims Do not simulate imports
-N, --no-modify Disallow self-modifying code (faster sometimes)
--no-strict Don't avoid invalid instructions and ESIL
--plugins Load r2 plugins
-P, --profile Get performance and runtime information
-2, --stderr Show stderr output
-0, --stdin Use stdin for target program
-1, --stdout Show stdout output
--version Prints version information
-v, --verbose Show verbose / debugging output
OPTIONS:
-a, --address <address> Address to begin execution at
-A, --arg <arg>... Argument for the target program
-x, --avoid <avoid>... Avoid addresses
-X, --avoid-strings <avoid_strings>... Avoid code xrefs to strings
-B, --break-strings <break_strings>... Breakpoint code xrefs to strings
-b, --break <breakpoint>... Breakpoint at some target address
-c, --constrain <SYMBOL> <EXPR> Constrain symbol values with string or pattern
-C, --constrain-after <SYMBOL> <EXPR> Constrain symbol or file values after execution
--env <env>... Environment variable for the target program
-e, --eval <ESIL>... Evaluate ESIL expression
-E, --eval-after <ESIL>... Evaluate ESIL expression after execution
-f, --file <PATH> <SYMBOL> Add a symbolic file
-F, --fuzz <fuzz> Generate testcases and write to supplied dir
-H, --hook <ADDR> <EXPR> Hook the provided address with an ESIL expression
-i, --include <SYMBOL> <EXPR> Assert symbol contains a string
-L, --libs <libs>... Load libraries from path
--max <max> Maximum number of states to keep at a time
-m, --merge <merge>... Set address as a mergepoint
-I, --not-include <SYMBOL> <EXPR> Assert symbol does not contain a string
-p, --path <path> Path to the target binary
-r, --r2-cmd <CMD>... Run r2 command on launch
-S, --set <REG/ADDR> <VALUE> <BITS> Set memory or register values
-s, --symbol <NAME> <BITS> Create a symbolic value
此工具可以用来解决与上面相同的 r100
crackme
$ radius2 -p tests/r100 -a 0x4006fd -x 0x400790 -s flag 96 -S A0 0x100000 64 -S 0x100000 flag 96
flag : "Code_Talkers"
或者使用字符串更快地解决
$ radius2 -p tests/r100 -s stdin 96 -X Incorrect
stdin : "Code_Talkers"
依赖关系
~6–14MB
~201K SLoC