本书汇编语言循序渐进提供以下代码作为沙箱:
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上运行时会产生seg错误。有没有办法获得有关导致分段错误的更多信息?
答案 0 :(得分:3)
您遇到的问题是您创建的程序超出了您编写的代码的末尾。
当您的程序执行时,加载程序将最终向jmp
发出_start
。然后你的代码会运行,但你最后没有任何东西可以返回操作系统,所以它会继续运行,在代码之后执行RAM中的任何字节。
最简单的解决方法是正确退出代码。例如:
mov eax, 0x1 ; system call number for exit
sub esp, 4 ; OS X system calls needs "extra space" on stack
int 0x80
由于您没有生成任何实际输出,因此您需要使用调试器来查看正在发生的事情。编译完成后,您可以使用lldb
逐步完成。
lldb ./sandbox
image dump sections
记下列出的可执行文件类型code
的地址(不是dyld)。它可能是0x0000000000001fe6。继续在lldb:
b s -a 0x0000000000001fe6
run
register read
step
register read
step
register read
此时你应该超越NOP并看到寄存器中的变化。玩得开心!