计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
re-address-space【效率与协作】地址空间换算统一处理:PIE/ASLR 基址确定、RVA/VA 转换、loader offset(固件加载地址 vs 链接地址)、 跨工具地址对齐(Ghidra/angr/frida/gdb)。 触发词:PIE、ASLR、基址、RVA、VA、loader offset、地址换算、重定位地址、gdb算地址、angr地址。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
地址相关问题
├── 静态文件(无运行态): VA/RVA/文件偏移换算 ──→ 本技能(步骤 1-2)
├── 运行态(进程/内存): 基址确定(PIE/ASLR)──→ 本技能(步骤 3)+ /proc/pid/maps
├── 跨工具对齐(Ghidra 显示 vs 运行时 vs angr)──→ 本技能(步骤 4)
└── 固件加载地址 vs 链接地址差 ──→ 本技能(步骤 5)
Process.getModuleByName(...).base / gdb info proc mappings / maps 文件)所有工具先验证再使用。全部为静态/轻量命令,可免沙箱。
apt install binutils / dnf install binutils / pacman -S binutils(多数预装)readelf --version;objdump --version确定文件侧基址(静态):
readelf -l target | grep LOAD # 首个 LOAD 段 p_vaddr 即链接基址(ET_EXEC 固定;ET_DYN/PIE 为 0 起相对)
readelf -h target | grep Type # EXEC(固定基址)/ DYN(PIE,运行时才定基址)
VA = p_vaddr + (file_offset - p_offset)(按段匹配,别用全文件线性换算)RVA / VA 换算:
RVA = VA - ImageBase(PE 语境)
VA = RVA + ImageBase
运行态基址(PIE / ASLR):
cat /proc/<pid>/maps | head -5 # 加载基址 = 首个映射(r--p,file offset 0x0)起点(Linux)
gdb -p <pid> -ex 'info proc mappings' -ex detach # 或 gdb 侧(跨平台)
Process.getModuleByName("libtarget.so").base(Frida 17+:静态 Module.findBaseAddress / Module.getBaseAddress 已移除,旧版本文法见 [[re-frida-script-author]])runtime_addr = link_addr + bias(如链接 0x1000 的符号在运行时 0x1000 + 0x7f0000000000)跨工具对齐:
Ghidra 地址 + bias = 运行时地址proj.loader.main_object.mapped_base(rebase 后基址);重定基址用后端对象的 obj.rebase(new_base)(如 proj.loader.main_object.rebase(...),cle Backend.rebase)gdb b *<链接地址> + <bias> 或 frida Process.getModuleByName("libfoo.so").findExportByName("func") 加偏移固件 loader offset:
实际地址 = 链接地址 + loader_offset;不确定时用启动代码里对自身地址的引用反推find 0x1234(文件偏移)后在 Ghidra/运行时找不到对应;原因——混淆偏移与 VA 两套坐标系;对策——按步骤 1 段映射换算,先确认读的是哪套file 报的入口与实际运行入口差一个常数;原因——链接器按 flash/ROM 地址链,运行时解压/重映射到 RAM;对策——步骤 5 反推 loader offset,别硬凑