【问题标题】:Assembly PUSH instruction with an OFFSET tag带有偏移标记的汇编 PUSH 指令
【发布时间】:2021-02-08 16:42:04
【问题描述】:

我用汇编编写了一个简单的“Hello World”程序:

global  _main
extern  _printf

section .text
_main:
    push  offset  message
    call  _printf
    add   esp, 4
    ret
section .data
    message db  'Hello, World2', 10, 0

我已经在 Ghidra 工具(免费软件 IDA 替代品)中打开了已编译的 .EXE,当我查看生成的汇编代码列表时,有这样的内容:

 push  message
 call  _printf
 add   esp,0x4

我的问题是:为什么那里没有 offset 关键字(就像在源代码中一样)?它是可选的吗?此外,当我想修补指令时,该工具不允许我输入 offset 关键字...

【问题讨论】:

  • 语法取决于工具。有些汇编器使用offset,有些则不使用。那些不需要的,通常需要[] 括号用于内存引用,以将其与地址区分开来。
  • 您最初使用什么汇编程序来构建您的程序?这看起来像 NASM 语法,只是其中有一个对 NASM 无效的 offset
  • Ghidra 如何反汇编像push [disp32] 这样的指令而不是push imm32?例如NASM push dword [message] 与 NASM push message。每个汇编语法都需要某种方法来区分这两种形式。

标签: windows assembly x86 ghidra


【解决方案1】:

汇编者属于两种信仰之一。

需要方括号来读/写内存的汇编器不需要offset 标签来引用标签的偏移量。这是 NASM 风格。
这些汇编器可以允许或禁止使用offset

不需要方括号来读/写内存的汇编器将需要offset 标签来引用标签的偏移量。这是 MASM 风格。

【讨论】:

  • 好的,伙计们,但是 Ghidra 既不允许使用 offset 语法,也不允许使用 []。以下是我可以在修补时插入 PUSH 指令的操作数:link
  • 它确实对我有用。但是,它如何显示您不能使用[] 并不明显。无论如何,如果你想要一个地址,你不需要[] 也不需要offset
  • 好的,也就是说汇编器内置工具不需要偏移量和[]语法?
  • 它需要[] 用于内存引用,或者可能类似于push word ptr [si]。它当然需要一种方法来区分推送地址和值。
  • 你也可以组装 push [si] 或类似的,看看 ghidra 是如何反汇编的。
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
相关资源
最近更新 更多