x86操作码,用于将字符串地址压入堆栈

时间:2019-02-25 05:49:16

标签: opcode hex-editors

我正在用十六进制编辑器更改可执行文件,我必须调用一个函数并传递一些文本作为参数。我的代码在.text部分中,并且我的字符串编码在其下面的.data部分中。说我的字符串是“ AAAA”。字符串的地址从“ 0x008000”开始。我正在尝试像这样推动字符串:

push [0x008000]    FF 35 00 08 00
call function      FF 15 11 11 11

该函数调用使用默认NULL值工作,所以我知道我正确地调用了它。

问题在于为其调用操作码。我正在努力理解推送的操作码格式。是否可以像这样直接推送字符串的地址?我已经在IDA中打开了我的可执行文件,以更好地了解现有代码如何将字符串压入字符串,但是我找不到一个明确的示例将字符串地址直接压入堆栈。反汇编代码中的大多数字符串要么存储在本地堆栈中,要么由标签调用,该标签到达一个偏移量,该偏移量会使堆栈中的某些内容脱离。我承认我不太了解标签的工作原理,因为似乎并没有出现明显的将存储在内存中且易于访问的字符串压入堆栈的情况。

任何解释都值得赞赏。

1 个答案:

答案 0 :(得分:1)

您具有push指令的PUSH r / m格式,该格式从寄存器中推入一个值或从内存中加载一个值(在本例中是从地址0x800加载),假设下一个字节为00,因为它是6字节指令。

如果您要推送 value 0x8000(将其视为函数中的地址),则需要使用PUSH immed32指令,该指令应为{{1} }请注意,这比PUSH r / m指令小一个字节,因此,如果您要执行二进制补丁,则需要在此之前或之后添加一个1字节的NOP(68 00 80 00 00)。