Files

3.7 KiB
Raw Permalink Blame History

rizin/radare2 工具特有坑与边界

r2 / rz 差异(迁移雷达)

  • 项目分叉:rizin 是 radare2 的分叉(2021 起,r2 5.x 时代),两者命令大体兼容但独立演进——r2 教程/博客的命令先 rz? 命令名 确认存在再执行
  • 插件体系不同:r2pm(r2)vs rz-pm(rz),插件不通用;rz-ghidra 是 rz 的反编译插件,r2 对应 r2ghidra(r2pm 安装)
  • 二进制名不同:r2/rabin2(r2)vs rizin/rz-bin(rz);rz-bin 参数与 rabin2 基本对齐(-I/-z/-i/-E/-l)
  • 个别命令名差异:rz 0.7+ 字符串命令 izz/iz 保留;但部分分析命令改名(如 r2 的 axt 系在 rz 全量保留,axg 输出格式不同)——以本技能 commands.md 的现行语法为准
  • 版本节奏:radare2 当前主线 6.2.x;Rizin 当前主线 0.9.x(以官方 Releases 最新为准,不锁定 patch 号)——2021 年分叉后独立演进,命令/API/插件 ABI 不得按共同版本经验推断,执行前用 r2 -v / rizin -v 核验。Rizin 0.9 起默认启用新分析器(RzAnalysis 2.0 风格行为,个别命令输出有变),大版本升级后先跑一遍验证命令

分析相关坑

  • 未分析先看 = 空数据:不开 -A/aaa 就没有函数边界与交叉引用——pdf/axt 输出空或错位是常态,先分析
  • aaa 全量在超大文件上极慢(固件几十 MB 可达分钟级):先用 aa 或 aa~,只对重点段 af @ 地址;分析中途可 Ctrl+C,已分析部分保留
  • pdf 依赖函数边界:stripped 目标必须 af @ 地址 先定义;无边界时输出可能只打印一条指令或错位
  • 字符串搜索用 izz 不是 iz:iz 只看当前段,.rodata 外字符串(.data 解密后)会漏——全量用 izz
  • PIE/ASLR 地址漂移:-A 分析得到的地址在调试运行后变化(加载基址不同)——调试会话用 dm 看真实基址,断点下符号名或按 dm 结果换算;静态分析阶段地址是文件映像地址,别拿去和调试内存地址直接比

调试器坑(rz 内置 vs gdb)

  • 命令体系不是 gdb:gdb 的 b/c/si 对应 rz 的 db/dc/ds——从 re-gdb 切过来先别顺手打 b main
  • 条件断点语法是 db 地址:条件(冒号),不是 gdb 的 b ... if ...
  • attach 受权限与 YAMA 限制:Linux 上 ptrace 限制(/proc/sys/kernel/yama/ptrace_scope)会让 rizin -d -p 失败——临时放开或换 gdb + 同权限启动
  • 内置调试器能力有限:无内核态调试、对多线程/信号处理不如 gdb 成熟——复杂调试场景直接转 re-gdb
  • 调试目标带反调试:ptrace 检测类反调试会干扰——静态分析定位检测点(/a 搜 ptrace 调用)后处理,见 re-anti-analysis

输出与批处理坑

  • 颜色/分页污染管道:命令输出经管道/重定向时带 ANSI 颜色与交互提示——加 -q 静默、e scr.color=0 关色、必要时 e scr.interactive=false
  • 批处理不回显错误:-c 'cmd; quit' 里命令出错只打印到 stderr——用 -e bin.cache=true 或脚本文件 -i 便于排错;检查退出码
  • 大输出刷屏:pdf 在超大函数上输出几千行——pdf @ 函数 | less 或 pd 50 分段看
  • Po 打开旧项目版本不匹配:rz 版本升级后旧项目可能加载失败——项目文件与版本强绑定,升级后重建分析

使用注意

  • 全部在沙箱内执行(re-analyze/platform-tips 最高原则);rizin -d 调试属动态执行默认沙箱
  • 命令细节以目标版本实际行为为准(rz -v 查版本);不同版本差异优先查 Rizin Book