assembly - 如何从目标文件的反汇编中找到位于某个地址的数据字节?
问题描述
我有一个目标文件fact.o
,它是一个二进制文件。为了检查目标文件的反汇编,我运行了以下命令:objdump -d fact.o
. 我得到以下输出:
fact.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <factorial>:
0: ba 01 00 00 00 mov $0x1,%edx
5: b8 00 00 00 00 mov $0x0,%eax
a: 39 f8 cmp %edi,%eax
c: 7f 08 jg 16 <factorial+0x16>
e: 0f af d0 imul %eax,%edx
11: 83 c0 01 add $0x1,%eax
14: eb f4 jmp a <factorial+0xa>
16: 89 d0 mov %edx,%eax
18: c3 retq
0000000000000019 <main>:
19: 48 83 ec 08 sub $0x8,%rsp
1d: bf 05 00 00 00 mov $0x5,%edi
22: e8 00 00 00 00 callq 27 <main+0xe>
27: 89 c2 mov %eax,%edx
29: be 05 00 00 00 mov $0x5,%esi
2e: bf 00 00 00 00 mov $0x0,%edi
33: b8 00 00 00 00 mov $0x0,%eax
38: e8 00 00 00 00 callq 3d <main+0x24>
3d: b8 00 00 00 00 mov $0x0,%eax
42: 48 83 c4 08 add $0x8,%rsp
46: c3 retq
我知道输出分为三列:指令“地址”、机器代码(存储在目标文件中的实际字节)和反汇编(从机器代码解释的汇编指令)。我的问题是如何找到位于某个地址的数据字节?例如:如何找到位于地址 0x10 的数据字节?我最初认为它是输出中的 0x89,但我很确定我不正确。任何帮助都可以帮助我解决这个问题。我仍在努力适应组装,任何信息都会对我有很大帮助。
注意:如果这与这个问题相关,我正在使用 gcc 9.2。
解决方案
我相信它应该只需要一点点数。
例如0x10
find ,首先你会在最左边的一列中找到最接近0x10
但低于该数字的数字。在这里,它是0xe
:
e: 0f af d0 imul %eax,%edx
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
然后我们只是数了一下。我们知道在0xe
,字节是0x0f
。0xf 将是0xaf
,紧随其后的字节0x0f
,0x10 将是0xd0
。
e: 0f af d0 imul %eax,%edx
e f 10
但是,这些地址仅相对于该部分的开头,不确定这是否是您想要的。请参阅Peter Cordes 的评论。
推荐阅读
- powershell - TeamCity Unresolved reference from powershell script on a powershell step
- twilio - Cloud Run 错误:容器无法启动。无法启动并监听 PORT 环境变量定义的端口
- c++ - 为什么 host_row_pitch 不应小于 clEnqueueWriteBufferRect 中的 region[0]
- ruby - Ruby 通过内容配置文件附件下载文件
- opendaylight - DLUX 需要哪些功能才能在 Opendaylight Sodium 中显示正常登录页面
- vb.net - 如何禁用复选框取决于 VB .Net 中的 datetimepicker?
- reactjs - 提前返回带有钩子的反应功能组件内的组件
- python - 如何根据数字对该文件进行排序并显示给读者?
- html - 如何在 HTML 中的头像图像上添加点标记?
- python - 使用带有 HTML 模式的 Telegram Messenger API 发送在线照片