如何使用pwn工具获取可执行文件的函数地址 无需objdump硬编码值
实现方案
完全可以通过pwntools工具实现无硬编码获取main函数地址,无需提前调用objdump手动解析二进制。
基础用法(符号表存在的场景)
大部分未被strip的可执行文件都保留了符号表,直接使用pwntools的ELF模块即可自动解析符号:
- 步骤1:加载目标二进制文件
from pwn import * elf = ELF("./目标可执行文件路径") - 步骤2:直接获取main函数的静态地址(和objdump输出结果完全一致)
main_static_addr = elf.sym["main"] print(f"main函数静态地址: {hex(main_static_addr)}")
运行时动态地址获取(适配PIE开启场景)
如果目标程序开启了PIE(位置无关可执行文件),加载到内存时基地址会随机变化,可直接通过进程对象获取实际运行的main地址:
p = process("./目标可执行文件路径") # pwntools会自动计算程序加载基址偏移,返回内存中实际的main函数地址 main_runtime_addr = p.elf.sym["main"] print(f"main函数运行时实际地址: {hex(main_runtime_addr)}")
符号表被strip的适配方案
如果二进制文件被strip删除了符号表,可通过入口点反汇编提取main地址:
- 先获取程序入口点地址:
entry_addr = elf.entry - 反汇编入口点附近的代码,通常入口点执行初始化后会调用main函数,提取调用指令的操作数即可得到main地址:
# 反汇编入口点后20字节的内容,查看调用main的指令 print(elf.disasm(entry_addr, 20))
内容的提问来源于stack exchange,提问作者Mocanu Gabriel
相关产品推荐
相关产品推荐

