#symbolic #execution #analysis #framework #tool #r2 #radare2

bin+lib radius2

使用 r2 的快速符号执行框架

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 调试

Download history 5/week @ 2024-04-26 8/week @ 2024-05-03 173/week @ 2024-05-10 36/week @ 2024-05-17 15/week @ 2024-05-24 8/week @ 2024-05-31 6/week @ 2024-06-07 5/week @ 2024-06-14 83/week @ 2024-07-05 8/week @ 2024-07-12

1,870 每月下载量

MIT 许可证

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 还“支持” MIPSPowerPCGameboy,但它们几乎完全没有经过测试。此外,radius2 支持执行 cBPFeBPF 程序。

radius2 只能执行涉及静态方法和变量的 Dalvik 字节码。

最后,对 65028051AVRh8300PICRISCVSH-4V810V850Xtensa 等也有不同程度的支持。

此外,可以使用 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