将值移动到堆栈指针时出现分段错误



当在中为地址赋值时,我首先在两个位置出现分段错误

mov [ebx] , eax

当我试图在处将值移动到堆栈指针后在堆栈上推送寄存器时

lea esp, [ebx+eax*2]
push eax

为什么会这样?

完整代码:

push ebp
mov ebp, esp
mov eax, 0x7FFFF 
mov ebx, 0x100000
mov [ebx] , eax
mov ecx, eax
inc eax
lea esp, [ebx+eax*2]
push eax
push ecx
xor ecx, [esp +4] 
shl ecx, 12
add ecx, 0x1000
dec ecx
xchg ecx, [esp]
xor eax, eax
mov esp, ebp
pop ebp
ret

我想你是想做的

lea   eax, [ebx+eax*2]     ; eax = ebx + eax * 2
push  eax                  ; then push that on the stack

但是您意外地使用了esp作为LEA的目的地,使用了整数作为新的堆栈指针,所以当您尝试push时,它不是一个有效的地址。

push eax类似于sub esp,4/mov [esp], eax(但没有写入FLAGS(,因此ESP必须指向有效内存。如果ebx是一个有效的指针,而eax是一个整数索引,那么计算缓冲区中的偏移量用作堆栈指针可能是有意义的,但没有理由期望0x100000 + 2 * 0x8000 = 0x110000是有效指针,即映射内存。

您不进行任何mmapVirtualAlloc系统调用,因此唯一映射的页面是操作系统的程序加载器为您映射的页面;只是保存代码和数据的页面。


或者您可能是故意这样做的,基于使用mov [0x100000] , eax。这当然失败的原因与在C:中失败的原因相同

int *p = (int*)0x100000;
*p = 0x7FFFF;

您不能只在具有内存保护的操作系统下运行的代码中设置指针值

如果需要,可以使用调试器或其他工具检查进程的内存映射。

相关内容

  • 没有找到相关文章

最新更新