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

时间:2018-08-04 12:59:05

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

在给地址赋值时,首先在两个地方出现分段错误

K.gradients()

并且当我尝试将值移动到堆栈指针

之后将寄存器推入堆栈时
K.function()

为什么会发生?

完整代码:

mov [ebx] , eax

1 个答案:

答案 0 :(得分:3)

我想你打算这样做

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是整数索引,则可能需要计算缓冲区的偏移量以用作堆栈指针,但是没有理由期望{{1} }是有效的指针,即指向映射的内存。

您不会进行任何0x100000 + 2 * 0x8000 = 0x110000mmap系统调用,因此唯一映射的页面是OS的程序加载器为您映射的页面;只是保存您的代码和数据的页面。


或者也许您是基于使用VirtualAlloc来故意这样做的。当然,此失败的原因与在C中失败的原因相同:

mov [0x100000] , eax

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

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