假设我们有一个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的操作码是什么?
答案 0 :(得分:4)
汇编程序不会将call
分解为两条指令。 call
是一个单独的指令,它有自己的机器语言操作码。
call
有不同的操作码,具体取决于调用的类型(近或远,作为相对值给出的地址或间接存储内容中的地址等)。对于32位模式下的正常调用类型(相对接近调用),您将使用操作码E8
后跟一个4字节值,该值指定目标地址,相对于call
之后的下一条指令。
有关详细信息,请参阅Intel Manual第2卷中call
的条目。
答案 1 :(得分:2)
正如@ wj32在上面的评论中所说,CALL
是一条指令 - 它不会“分解”为PUSH
和JMP
。 CALL
的操作码可以是E8
,9A
或FF
,具体取决于目标地址的指定方式。有关各种不同操作码的完整详细信息,请参阅第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