【发布时间】:2016-07-10 02:33:20
【问题描述】:
Assembly Language Step by Step一书提供了以下代码作为沙箱:
section .data
section .text
global _start
_start:
nop
//insert sandbox code here
nop
我在沙盒空间中包含的任何示例都是创建分段错误。例如,添加这段代码:
mov ax, 067FEh
mov bx, ax
mov cl, bh
mov ch, bl
然后编译:
nasm -f macho sandbox.asm
ld -o sandbox -e _start sandbox.o
当我在我的 OS/X 上运行它时会产生一个段错误。有没有办法获得有关导致分段错误的原因的更多信息?
【问题讨论】:
-
在调试器下运行它会是一个好的开始。在这种情况下,崩溃的原因可能是因为在执行了程序中的最后一条 NOP 指令后,CPU 继续执行它之后恰好在内存中的指令。
-
如果我在调试器中运行它,它会自动终止并出现段错误。
-
理想情况下,您希望程序的行为在调试器下运行时不会改变。它至少应该告诉你你的程序在哪里崩溃以及是什么指令导致了崩溃。
-
Program received signal SIGSEGV, Segmentation fault. 0x00002002 in ?? ()有没有办法保护程序免受内存中出现的任何指令的影响? -
如果这是您的代码的总和,那么您正在崩溃,因为您正在运行超过代码的末尾。挂在那里的随机数据被解释为实际代码,一旦它尝试从您的内存区域读取或写入内存,就会导致段错误。