【问题标题】:assembly jmp to a line that doesn't exist汇编 jmp 到不存在的行
【发布时间】:2019-04-17 13:19:33
【问题描述】:

对于说“jmpq *0x400850”的行,实际上没有这样的行有0x400850。在这种情况下,由于我无法跳转到它提到的地方,我是否跳过该命令并转到下面一行中的命令?

所以答案告诉我在终端输入“objdump”,所以我输入了

    objdump -d ./bin-lab-ref > output.txt

我在终端中没有输出。 在这种情况下我该怎么办?

【问题讨论】:

  • * 表示间接跳转,即通过内存中的指针。 0x400850 是该指针的地址,而不是跳转的目标。 PS:请不要使用图像作为代码,而是将其复制粘贴为文本。
  • 这是一个无条件的jmp;它永远不会失败。在机器代码中,jmp 不会“搜索”目标行或地址,它只是跳转到那里。
  • 请注意,程序集是由指令而不是命令组成的。尽量使用正确的术语,这样其他人更容易帮助你。
  • 使用 Intel 语法,你也许能读懂一些东西 ;)
  • 下次请不要发代码图片。始终以文本而不是图片的形式发布代码!

标签: assembly x86 reverse-engineering att


【解决方案1】:

指令jmpq *0x400850(,%rax,8) 跳转到存储在地址0x400850(,%rax,8) 的值,而不是地址0x400850(,%rax,8) 本身。很可能,该地址有一个跳转表,rax 从跳转表中选择一个条目进行跳转。

检查0x400850 周围的内存以找出跳转表有哪些条目以及跳转的位置。您可以使用objdump -s 获取可执行文件映像的转储。

【讨论】:

  • @JuniperSohn 内存地址400850 可能不是.text 部分的一部分,而是.rodata 部分的一部分。由于此部分不包含代码(而是数据),因此如果您传递-d,则不会对其进行反汇编。检查objdump -s 的输出以查看所有部分的内容。
  • @JuniperSohn:这是数据,不是代码,所以objdump -d 不会显示它。但是objdump -s-D 将十六进制转储所有部分。或者在调试从可执行文件启动的正在运行的进程时在 GDB 中查看它。该地址看起来与.section .rodata 差不多,并且与您显示的说明在同一页面中,因此它肯定存在。
  • @JuniperSohn 如果您在解释objdump -s 的输出时遇到问题,请随时发布它,我可以告诉您它的含义。确保将其发布为文本,而不是图像。永远不要发布文字图片。
  • @Jester someone™ 应该向所有炸弹实验室提出规范的问题/解决方案,以摆脱这些问题。到时候他们确实有点烦人。
  • 我猜这是this的64位版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 2019-06-04
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多