3

我正在尝试将值从有效内存中移入albl移入,但我不断遇到分段错误。我的程序所做的是获取定位的值[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
4

1 回答 1

3

代码没有任何问题。但是因为它写入失败esi但读取成功,esi它必须意味着目标地址是有效的,但写保护。

esi 的值很可能源自只读的 .text 段。

不太可能的可能性是代码段是可写的,并且 esi 指向下一条指令,然后修改该指令以包含无效指令。

于 2013-04-29T08:08:32.213 回答