3

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
4

1 に答える 1

3

コードには何も問題はありません。しかし、書き込みには失敗esiするが読み取りには成功するesiため、宛先アドレスは有効であるが書き込み保護されていることを意味する必要があります。

ほとんどの場合、esi の値は、読み取り専用の .text セグメントから生成されます。

コード セグメントが書き込み可能であり、esi が次の命令を指している可能性はほとんどありません。

于 2013-04-29T08:08:32.213 に答える