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

问题描述 投票:1回答:1

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

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

函数调用使用默认的NULL值,所以我知道我正确调用它。

问题是为它调用操作码。我正在努力理解推送的操作码格式。是否可以像这样直接推送字符串的地址?我已经在IDA中打开了我的可执行文件,以便更好地了解现有代码如何推送字符串,但是我无法找到直接推送到堆栈的字符串地址的明确示例。反汇编代码中的大多数字符串要么存储在本地堆栈中,要么由标签调用,该标签会转移到偏离堆栈的偏移量。我承认我并不完全知道标签是如何工作的,因为似乎没有一个点存储在内存中且易于访问的字符串被清楚地压入堆栈。

任何解释都表示赞赏。

opcode hex-editors
1个回答
1
投票

你有推送指令的PUSH r / m格式,它从寄存器中推出一个值或从内存加载 - 在这种情况下从地址0x800加载 - 假设下一个字节是00,因为它是一个6字节的指令。

如果你想推送值0x8000(你将把它作为函数中的地址),你需要使用PUSH immed32指令,这将是68 00 80 00 00注意,它比PUSH r / m小一个字节如果您正在尝试进行二进制补丁,则需要在之前或之后添加1字节NOP(90)。

© www.soinside.com 2019 - 2024. All rights reserved.