3.8 KiB
3.8 KiB
lldb 工具特有坑与边界
macOS 权限栈(attach 前置,逐层排查)
- TCC(隐私与安全性 > 开发者工具):非授权终端 attach 报
permission denied或静默失败——系统设置手动授权后重启终端;弹窗无法命令行绕过 - DevToolsSecurity:旧系统(10.14 前)还需
sudo DevToolsSecurity -enable;新系统此命令已非必需 - task_for_pid entitlement:调试器进程需要 task_for_pid 权限——普通终端下 lldb 依赖 Developer Tools 授权链,越狱/企业环境另有路径(属 re-mobile 域)
- Hardened Runtime:目标启用 Hardened Runtime(macOS 10.14.4+)时调试 API 受限(如
get-task-allow缺失)——目标先重签(codesign -f -s -或带com.apple.security.get-task-allowentitlement,见 re-format-macho) - SIP:
csrutil status确认;SIP 关闭只影响系统保护进程 attach,普通目标不用动 - 排查顺序: TCC 授权 → DevToolsSecurity → csrutil → 目标签名/entitlement——逐层排除,别一上来关 SIP
版本差异
- Xcode lldb vs llvm.org lldb:Xcode 自带版本与上游 llvm 版本不同步(版本号差异大);
brew install llvm的 lldb 新于系统版,功能/API 更新——脚本依赖以实际版本为准 - Swift 工具链 lldb:Swift 表达式求值支持最好;无 Swift 需求的逆向场景用系统/llvm 版即可
- Python API 兼容:
lldb.SBDebuggerAPI 跨版本大体稳定但偶有增减——lldb -s批处理脚本比 Python 脚本跨版本更稳 - Linux 发行版 lldb 版本滞后:apt/dnf/pacman 的 lldb 版本落后上游——需要新特性时用 llvm.org 官方二进制或 brew
调试行为坑
- 表达式求值有副作用:
expr会真实执行代码(调用函数、写内存、触发消息发送)——在 hook 点乱求值可能改变目标行为甚至崩溃;只读验证用frame variable - 条件断点永远不命中:条件里引用了未加载符号/类型时会静默失败——先无条件断确认能停,再逐级加条件
- ASLR 基址漂移:macOS 默认开启随机基址——每次
run后image list基址都变;脚本硬编码地址失效,用符号断点或image list -o换算 - stripped 目标没有
-n断点:breakpoint set -n找不到符号——用image lookup -a反查地址归属,或对-rn正则碰运气;地址断点 +image list -o换算 memory read格式冲突:不同宽度/格式混用时报invalid format——显式-s 4 -f x一组组给- attach 后目标冻结:附加后目标默认暂停(SIGSTOP)——
continue才恢复;忘记 continue 会以为目标卡死 - wow64 类场景(32 位目标):64 位 lldb 调试 32 位 macOS 目标正常(系统自带 32 位支持),但
expr的指针宽度按 64 位算——按目标位数写表达式
反调试与边界
- ptrace 检测:目标可调
ptrace(PT_DENY_ATTACH)拒绝附加(启动即拒绝)——先静态定位(re-format-macho / re-ida 找 ptrace 调用),patch 掉后再调试 - 调试器特征检测:
sysctl/task_info枚举调试标志——检测点先静态处理(见 re-anti-analysis) - 内核调试门槛高:macOS 内核调试需 KDK 版本匹配 + 开发内核启动参数——普通逆向不划算,别在用户态调试上耗时间
- iOS 远程调试:
platform select remote-ios+ debugserver 需要签名/越狱环境——环境问题归 re-mobile,本技能只管命令层面
使用注意
- 全部在沙箱内执行(re-analyze/platform-tips 最高原则);attach 需 Developer Tools 授权
- 目标为恶意样本时先静态初勘(re-triage 哈希/re-format-macho 结构)再动态
- 结论写 re-analyze/analysis-contract;符号/地址证据与 re-triage 初勘值对照