如何获得有关seg故障的更多信息?

时间:2016-03-22 23:52:51

标签: macos assembly x86 nasm

本书汇编语言循序渐进提供以下代码作为沙箱:

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错误。有没有办法获得有关导致分段错误的更多信息?

1 个答案:

答案 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并看到寄存器中的变化。玩得开心!