2013-04-29 86 views
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 

回答

2

的代码并没有什么错。但是,由于写入esi失败,但成功读取esi,它必须表示目标地址有效,但写保护。

最有可能的esi值是源自.text段,它是只读的。

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

+0

我会发布我现在有的完整代码,它实际上是一段使用跳转,调用,流行技术的shellcode – 2013-04-29 08:10:11

+0

我认为你可能是对的,.text段不可写 – 2013-04-29 08:13:23

+0

您可以通过省略'jmp short EncodedShellcode'并将Shellcode放置到'.data'来验证。然后为了克服这个问题,文本段必须重新编程为可写(通过一些系统调用)在这里查看详细信息:http://stackoverflow.com/questions/4169417/self-modifying-code – 2013-04-29 08:27:08