gpt4 book ai didi

linux - 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

转载 作者:行者123 更新时间:2023-12-03 09:53:40 24 4
gpt4 key购买 nike

我无法用以下汇编代码产生“总线错误”。这里我使用的内存地址不是合法的“规范地址”。那么,我该如何触发该错误?

我在带有 NASM 2.14.02 的 Ubuntu 20.04 LTS 下运行这段代码,但它导致负载出现 SIGSEGV 段错误,而不是 SIGBUS。

global _start
section .text
_start:
mov rax, [qword 0x11223344557788]
mov rax, 60
xor rdi, rdi
syscall

编译后对应的X86-64汇编代码:

Disassembly of section .text:

0000000000401000 <_start>:
401000: 48 a1 88 77 55 44 33 movabs 0x11223344557788,%rax
401007: 22 11 00
40100a: b8 3c 00 00 00 mov $0x3c,%eax
40100f: 48 31 ff xor %rdi,%rdi
401012: 0f 05 syscall

最佳答案

如果您查看 MOV 的指令集架构手册您会发现访问非规范地址会产生 #GP(0) General Protection Fault:

enter image description here

Linux 将所有 #GP 异常映射到 SIGSEGV 信号(段错误)。但是,在 Linux 中,非规范地址有一种方法可以导致 Bus Error,那就是让处理器引发 #SS(堆栈段)异常. Linux 将 #SS 异常映射到 SIGBUS 信号。将堆栈指针设置为非规范地址,然后执行堆栈相关操作将产生此类异常。

这段代码应该产生一个总线错误:

global _start
section .text
_start:
mov rsp, 0x8000000000000000 ; Set RSP to a non-canonical address
push rax ; Pushing value on stack should produce BUS ERROR

在 Linux 上产生总线错误的另一种方法是引发 #AC(对齐检查)异常。如果您在 RFLAGS 中编写启用对齐检查位(第 18 位)的环 3(用户)代码并进行未对齐的内存访问,您还应该收到 SIGBUS 信号。此代码应产生一个总线错误:

global _start
section .text
_start:
pushf ; Put current RFLAGS on the stack
or dword [rsp], 1<<18 ; Enable bit 18 (Alignment Check) of the
; RFLAGS value saved on stack
popf ; Pop new RFLAGS flags value into the RFLAGS register
mov eax, [rsp + 1] ; Move a DWORD value from unaligned address
; Should produce a BUS ERROR

关于linux - 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62621661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com