【问题标题】:Segmentation fault while moving value to stack pointer将值移动到堆栈指针时出现分段错误
【发布时间】:2019-01-12 03:02:16
【问题描述】:

将值分配给地址时,我首先在两个地方遇到分段错误

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

【问题讨论】:

  • 也许您没有操作系统的权限来写入您已将堆栈指向的内存页面?你为什么改变ESP?我假设这是在 Linux 或其他操作系统下?
  • 我想通过在汇编中分配值来进行小型培训,以了解堆栈如何更改它的值和值寄存器存储
  • @MichaelPetch 我在 Windows 上使用 SASM IDE
  • 您不能将堆栈指针更改为任意值,然后对堆栈进行读/写操作,除非您以某种方式分配了具有读/写权限的相关内存。
  • 如果你想看看栈是如何工作的,那么 push 和 pop 值,看看 esp 是如何变化的。您不能只是将堆栈指针设置为任意值。

标签: assembly x86 segmentation-fault stack low-level


【解决方案1】:

我想你是故意的

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;

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

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

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2021-12-03
    • 2021-08-05
    • 2013-04-16
    • 2020-02-18
    相关资源
    最近更新 更多