将值移动到堆栈指针时出现分段错误
Segmentation fault while moving value to stack pointer
我在给地址
赋值时首先在两个地方遇到了段错误
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
是一个有效的指针,即映射内存。
您没有进行任何 mmap
或 VirtualAlloc
系统调用,因此唯一映射的页面是 OS 的程序加载器为您映射的页面;只是包含您的代码和数据的页面。
或者您可能是故意这样做的,基于使用 mov [0x100000] , eax
。这当然会失败,原因与在 C:
中失败的原因相同
int *p = (int*)0x100000;
*p = 0x7FFFF;
你不能在 OS 内存保护下在代码 运行 中编写指针值。
如果需要,可以使用调试器或其他工具来检查进程的内存映射。
我在给地址
赋值时首先在两个地方遇到了段错误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
是一个有效的指针,即映射内存。
您没有进行任何 mmap
或 VirtualAlloc
系统调用,因此唯一映射的页面是 OS 的程序加载器为您映射的页面;只是包含您的代码和数据的页面。
或者您可能是故意这样做的,基于使用 mov [0x100000] , eax
。这当然会失败,原因与在 C:
int *p = (int*)0x100000;
*p = 0x7FFFF;
你不能在 OS 内存保护下在代码 运行 中编写指针值。
如果需要,可以使用调试器或其他工具来检查进程的内存映射。