我正在尝试将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
答案 0 :(得分:2)
代码没有任何错误。但是因为它写入esi
失败但成功读取esi
它必须意味着目标地址有效,但写保护。
最有可能的是esi的值来自.text段,它是只读的。
不太可能的是,代码段是可写的,并且esi指向下一条指令,然后将其修改为包含无效指令。