您的代碼拆開來是這樣的:
00000000 31C0 xor eax,eax
00000002 50 push eax
00000003 682F2F7368 push dword 0x68732f2f
00000008 682F62696E push dword 0x6e69622f
0000000D 89E3 mov ebx,esp
0000000F 50 push eax
00000010 53 push ebx
00000011 89E1 mov ecx,esp
00000013 99 cdq
00000014 B00B mov al,0xb
00000016 CD80 int 0x80
禮貌的ndisasm
。讓我們一步一步地完成這些指令並分析堆棧幀。
xor eax,eax
將eax
寄存器清零,因爲操作數與其自身的XOR操作總是會產生零結果。然後push eax
將值壓入堆棧。因此,堆棧目前看起來或多或少像這樣(相對於在代碼的開始的的esp
值示出偏移量,esp
意味着esp
目前指向堆棧小區):
+----------+
0 | 00000000 |
esp -4 | xxxxxxxx |
+----------+
接下來,我們2個push dword
指令,這推動了一些直接的價值堆棧,其中 - 它們執行後 - 看起來是這樣的:
+----------+
0 | 00000000 |
-4 | 68732f2f |
-8 | 6e69622f |
esp -12| xxxxxxxx |
+----------+
esp
當前指向那個被推到堆棧中的第二立即值的最後一個字節。讓我們嘗試將推送的值解釋爲ASCII,按照從當前值esp
開始按順序從堆棧中讀取的順序進行解釋。我們得到2f62696e2f2f7368
的字節序列,其ASCII碼等於/bin//sh
。另外,序列以0結尾,所以它是一個有效的C字符串。
這就是爲什麼當前值esp
被保存到寄存器ebx
中的主要原因。它包含將要運行的可執行文件的路徑。雙斜槓對操作系統來說不是問題,因爲POSIX只是忽略了多次出現的斜槓並將它們視爲一個斜線。
接下來,我們將當前值eax
和ebx
推入堆棧。我們知道eax
包含零,並且ebx
包含指向C字符串"/bin//sh"
的指針。堆棧目前看起來是這樣的:
+----------+
0 | 00000000 |
-4 | 68732f2f |
-8 | 6e69622f |
ebx -12| 00000000 |
-16| (ebxVal) |
ecx esp -20| xxxxxxxx |
+----------+
推寄存器的值到堆棧後,當前指針esp
保存在ecx
。
cdq
cdq
是一種在這種情況下執行非常整潔的技巧的指令:它將eax
的當前值簽名擴展到edx:eax
寄存器對中。因此,在這種情況下,由於零的符號擴展爲零,因此它會將值edx
中的值清零。當然,我們可以通過xor edx, edx
清除edx
中的值,但該指令使用兩個字節編碼 - 而cdq
只佔用一個。
下一條指令將值0xb
(11)放入eax
的低字節寄存器中。與前一種情況類似,我們可以僅執行mov eax, 0xb
,但這會導致5字節指令,因爲立即數必須編碼爲完整的32位值。
int 0x80
在Linux上調用系統調用調用程序。該公司預計的系統調用在eax
額外的參數在ebx
,ecx
,edx
,esi
,edi
和ebp
數目(現在等於0xb
,所以sys_execve
函數將被調用),和。
現在,讓我們來看看原型該系統調用:
int execve(const char *filename, char *const argv[], char *const envp[]);
因此,filename
說法被放置在ebx
- 它指向/bin//sh
。 argv
,置於ecx
中,是要執行的可執行文件的參數數組,必須以NULL
值終止。在Intel架構上,NULL
等於0
,而ecx
指向的是:指向/bin//sh
的指針,然後是NULL
的值。 envp
(即NULL
)指向一組環境值,其值必須表示爲char*
值key=value
。
execve
的成功執行導致當前過程映像替換爲指向可執行文件的映像,並使用所提供的參數執行該映像。在這種情況下,/bin/sh
將被執行(如果存在),參數爲/bin//sh
。
邁克爾可能是正確的,爲什麼這不起作用:最近的Linux內核將數據頁標記爲不可執行,並試圖執行它們將導致分段錯誤。
您的系統可能會將您的堆棧所在的頁面標記爲不可執行。在一個調試器中,你會看到'call'指令時的分段錯誤,其地址爲'buf'作爲參數。你的任務是否涉及繞過這種保護? – 2013-02-12 08:09:12
@MichaelFoukarakis我曾打算補充一點,但已經晚了!我現在已經編輯了這個問題,提供了更多的信息來回答我相信的這個問題。 – 2013-02-12 20:14:28
那麼,你面臨的問題與有問題的代碼無關。也許你想發佈你的任務的目標? – 2013-02-12 20:17:52