如何在x86函数调用期间找到jmp地址?

时间:2010-12-31 09:21:41

标签: assembly x86

假设我们有一个call foo语句。因此,当汇编程序遇到调用语句时,它会将其分解为 -

push ip + 6
jmp <addr of foo>

我在寄存器ebx中有返回地址。现在我想找出“foo的加法器”。我该怎么做?我想确认在jmp之前存在push语句。内存映射会是这样的吗?

-------
push (what will be the value stored in this byte?? opcode ??)
-------
jmp (what will be the value stored in this byte?? opcode ??)
-------
jmp byte 1
-------
jmp byte 2
-------
jmp byte 3
-------
jmp byte 4
-------
return address stored in ebx
-------

push和jmp的操作码是什么?

4 个答案:

答案 0 :(得分:4)

汇编程序不会将call分解为两条指令。 call是一个单独的指令,它有自己的机器语言操作码。

call有不同的操作码,具体取决于调用的类型(近或远,作为相对值给出的地址或间接存储内容中的地址等)。对于32位模式下的正常调用类型(相对接近调用),您将使用操作码E8后跟一个4字节值,该值指定目标地址,相对于call之后的下一条指令。

有关详细信息,请参阅Intel Manual第2卷中call的条目。

答案 1 :(得分:2)

正如@ wj32在上面的评论中所说,CALL是一条指令 - 它不会“分解”为PUSHJMPCALL的操作码可以是E89AFF,具体取决于目标地址的指定方式。有关各种不同操作码的完整详细信息,请参阅第3.2节“CALL”下的Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M

答案 2 :(得分:1)

这取决于call的类型。您可以从Intel manuals获取所需的所有信息。这包括指令编码等。我将引用下面的相关位(对于近距离调用):

  

目标操作数指定代码段中的绝对偏移量(偏移量)   从代码段的基础)或相对偏移(有符号的位移相对   到EIP寄存器中指令指针的当前值;这个价值   指向CALL指令后面的指令)。 CS寄存器不是   在接近电话时改变了。

答案 3 :(得分:0)

使用一个诈骗者,我想你最终可能会得到foo的绝对地址!因为链接器会这样做,编译后的代码没有名称。全局变量也是如此 例如,如果你组装你得到j foo 但编译然后消息nd ull得到j 0X45335