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指令中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章