x86 - Intel 引脚修改指令地址
问题描述
我正在尝试使用 Intel Pin-tool 工具对可执行二进制文件进行一些指令分析。
在分析我的 Pin-tool 中执行的指令后,我观察到收到的指令地址(程序计数器)值范围与我在使用objdump -d -S <binary>
. 我正在标准的 Linux/bin/ls
可执行二进制文件上对其进行测试。
根据我的理解,Pin 修改了原始二进制文件以放置自己的“钩子”来收集执行相关信息,这些信息在我们想要的 Pin 工具中调用回调进行分析。因此,这自然会导致实际执行的二进制文件与原始文件不同。不幸的是,我不知道其他关于 Pin 的幕后花絮。
我想知道是否有任何方法可以保留原始代码布局,或者获得旧二进制和新二进制指令地址之间的某种对应关系?
解决方案
现代发行版使用 PIE 可执行文件,它们是在运行时重定位的 ELF 共享对象。 objdump
仅向您显示相对于图像库的地址。 gcc 和 ld 中与位置无关的可执行文件的 -fPIE 选项是什么?x86-64 Linux中不再允许使用 32 位绝对地址?
您可以像 GDB 那样禁用 ASLR,这样它总是会重新定位到同一个地方,例如0x55555...
,但它仍然不会匹配objdump
地址。
你可以我认为objdump --adjust-vma=offset
用来重新定位你的拆卸。
或者您可以使用 objdump 构建非 PIE 可执行文件,gcc -no-pie -fno-pie -O3
这样 objdump 将知道每条指令的真实运行时地址。
推荐阅读
- python - 如何防止 Flask-SQLAlchemy 中的 SQL 注入?有没有更好的方法从 CSV 加载数据?
- lua - 如何只运行一次鼠标单击功能
- ios - 没有子视图的快照视图,或访问子视图的方法
- r - 在字符串上分隔行并保留原始行
- angular - 如何从 Angular 组件的服务中获取字符串值?
- amazon-web-services - 在 AWS 中如何获取图像 ID 列表
- javascript - 关于对象的不可变更新模式:newObject=JSON.parse(JSON.stringify(object))?
- java - 如何使用 JButton 的模型?
- r - 在调整“关系”时在 R 中加入表格
- python - 我的 python 函数在 jupyter notebook 中不起作用