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
答案 0 :(得分:3)
rdi包含一段代码的地址
许多系统通过主动防止写入代码区域(a)来提供针对恶意代码的保护。例如,代码选择器可能指向标记为只读的内存块(除非您正在运行代码以尝试以某种特权模式对其进行修改)。
在这种情况下,您几乎肯定会遇到这种保护机制。解决方案的方式(假设允许)将取决于您环境中比当前提供的更多细节(例如,操作系统)。
例如,在Linux下,您可以使用mprotect
来更改虚拟内存空间中某些地址范围的保护。
(a)有些人还会阻止您像执行代码一样执行数据,这意味着即使您将代码移动到可以编写的位置,您也可能无法执行。