mov指令中的分段错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mov指令中的分段错误相关的知识,希望对你有一定的参考价值。

rdi包含一段代码的地址。我正在尝试对该代码实现XOR编码。当我运行该代码时,mov指令会导致分段错误。任何人都可以帮忙吗?

mov byte al,[rdi];   No errors
xor al,0x7f
mov byte [rdi],al;   Causes segmeation fault

完整代码:

section .text
    global _start
    _start:
        call encrypt
    code:
        xor rax,rax
        xor rdx,rdx
        xor rcx,rcx
        xor rdx,rdx
        mov rdi,0x636e2f6e69622f2f
        shr rdi,0x8
        push rdi
        mov rdi,rsp
        mov rsi,0x6c2dffffffffffff
        shr rsi,0x30
        push rsi
        mov rsi,rsp
        mov rbx,0x702dffffffffffff
        shr rbx,0x30
        push rbx
        mov rbx,rsp
        mov rcx,0x30393039ffffffff
        shr rcx,0x20
        push rcx
        mov rcx,rsp
        mov rdx,0x652dffffffffffff
        shr rdx,0x20
        push rdx
        mov rdx,rsp
        xor r8,r8
        mov r8,0x68732f6e69622f2f
        shr r8,0x8
        push r8
        mov r8,rsp
        push r8
        push rdx
        push rcx
        push rbx
        push rsi
        push rdi
        mov rsi,rsp
        mov al,59
        syscall
    encrypt:
        pop rdi
        mov cl,0x8a
        mov bl,0
    loo:
        dec cl
        mov byte al,[rdi]
        xor al,0x7f
        mov byte [rdi],al  ;segfault occurs here
        inc rdi
        jne loo
        jmp code
答案

rdi包含一段代码的地址

许多系统通过主动阻止对代码区域的写入来提供对恶意代码的保护(a)。例如,代码选择器可能指向一个标记为只读的内存块(除非您运行代码试图以某种形式的特权模式修改它)。

在这种情况下,你几乎肯定会遇到这种保护机制。你如何解决它(假设它是允许的)将取决于你的环境的更多细节而不是你当前提供的(例如操作系统)。

例如,在Linux下,您可以使用mprotect来更改虚拟内存空间中某些地址范围的保护。


(a)有些还会阻止您执行数据,就像它是代码一样,即使您将代码移动到可以编写的地方,也可能无法执行它。

以上是关于mov指令中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

导致表达式语法错误的 mov 指令

伪指令的MOV32 伪指令

装配分段故障恢复

使用基本 SSE 指令的分段错误

xmm 指令 - 内存源操作数的分段错误

mov指令用法