2014-01-12 45 views
1

我知道它做了什麼,但我真的很喜歡解釋爲什麼?請解釋我的程序集Shellcode的缺失行。什麼是EXECVE參數?

SECTION .data 
     global _start 
_start: 
     jmp j ;jump to 'j' label 
r: 
     pop ebx ;Pop the address of 'shell' into EBX. Parameter is Filename 
     xor eax, eax ; clear EAX register 
     mov BYTE[ebx+7], al ;push one NUL byte to end any string reading 
     mov DWORD[ebx+8], ebx ;mov address of EBX into the content EBX (offset of 8) 
     mov DWORD[ebx+12], eax ;mov 4 NUL bytes at EBX (offset of 12) 
     mov al, 11d ;execve system call 
     lea ecx, [ebx+8] ; HELP 
     lea edx, [ebx+12] ; HELP 
     int 80h ;Kernel call 
j:  call r ;call r... pushes 'shell' address onto the stack 
shell: db "/bin/sh" ;file name 

具體來說,我想知道:
1)什麼是execve的的3個參數(我已經看過了man 2 execve並沒有幫助)
2)究竟是什麼LEA做這個案例?

回答

2

您對mov DWORD[ebx+8], ebxmov DWORD[ebx+12], eax的意見是錯誤的或至少是誤導性的。

標籤'shell'處的字節是'/ bin/sh',它使得7個字節,並且mov BYTE[ebx+7], al終止這個字符串以空字節。

下一條語句mov DWORD[ebx+8], ebx將ebx(它是指向shell的指針)的內容移動到shell後面的4個字節。

之後,mov DWORD[ebx+12], eax將零移動到下4個字節。因此,我們有以下的存儲器佈局,其中bxbxbxbx是這個存儲器塊的開始地址:

bx         value=bx, points to /bin/sh 
    |        ___________ 
    v        /   \ 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
|/| b | i | n |/| s | h |\0 |bx |bx |bx |bx | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 

兩個LEA指令移動(BX + 8)和(BX + 12)的地址,以CX和dx,分別。你可以用MOV CX, BX; ADD CX, 8; MOV DX, BX; ADD DX,12替換它們。

bx 
    | 
    v 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
|/| b | i | n |/| s | h |\0 |bx |bx |bx |bx | 0 | 0 | 0 | 0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+ 
           ^   ^
            cx    dx 

現在,如果你看一下execvp:

第一個參數,在BX,是一個指向包含要執行的文件的名稱的字符串。那是/bin/sh。 cx中的第二個參數是一個指向要傳遞給程序以作爲argv執行的字符串數組的指針。在這裏,它由一個指向「/ bin/sh」的指針和一個NULL指針組成。 NULL指針用作數組終結符(參見execve docs),因爲沒有明確的數組長度。 dx中的第三個參數是指向新進程環境的指針 - 因爲它是一個指向NULL指針的指針,新進程不會從您那裏繼承任何環境變量。

+0

美麗的解釋。 Upvoted和接受。 – Goodies