2013-04-29 43 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