我想通過編寫「Hello World」到控制檯(使用Windows XP 32位)來測試緩衝區溢出。 shellcode需要是無空的,以便通過「scanf」傳遞到我想溢出的程序中。我發現很多Linux的彙編教程,但是沒有一個適用於Windows。有人可以請我通過這個使用NASM? Thxxx!用於Windows的簡單「Hello-World」,無null shellcode需要
回答
彙編語言由您的處理器定義,彙編語法由彙編器定義(因此,在& t和intel語法)主要區別(至少我認爲它曾經是...)是窗口是實模式的(調用實際的中斷來完成任務,並且可以使用計算機可訪問的所有內存,而不僅僅是程序),並且linux是保護模式(您只能訪問程序的小內存,你必須調用int 0x80並調用內核,而不是調用硬件和BIOS)。無論如何,hello世界類型的東西或多或少會在linux和windows之間相同,只要它們是兼容處理器。爲了從你的程序中獲取shellcode,只需將它加載到目標系統的 調試器(gdb for linux,調試windows),然後在調試中輸入d(或者是它嗎?不管怎樣,它應該說如果你輸入h(幫助)),並且指令和內存之間將是操作碼。 只需將它們全部複製到您的文本編輯器中,並將其轉換爲一個字符串,然後製作一個將它們全部轉換爲ASCII值的程序。不知道如何做到這一點在gdb壽...
無論如何,使其成爲一個bof漏洞,輸入aaaaa ...並繼續添加一個,直到它從緩衝區溢出錯誤崩潰 。但是,確切地找到它需要多少個才能使其崩潰。然後,它應該告訴你這是什麼內存地址。通常它應該在錯誤信息中告訴你。如果它說'9797 [原來的返回地址的其餘部分]',那麼你明白了。現在,你必須使用你的調試器來找出這是哪裏。用您的調試器反彙編程序並查找scanf被調用的位置。在那裏設置一個斷點,運行並檢查堆棧。尋找所有那些97(我忘了提及'a'的ascii數字),看看它們在哪裏結束。然後刪除斷點並輸入你發現的數量(確切的數量),如果錯誤信息是'97緩衝區溢出'[原始返回地址的其餘部分]「,則刪除最後一個,將你發現的地址放入檢查堆棧,並插入你的shellcode。如果一切順利的話,你會看到你的shellcode執行。
快樂黑客...
大會的操作碼是相同的,所以正規的招數仍然生產無空的shellcodes在Linux中,你使用「int 0x80」指令進行系統調用,而在Windows上,你必須使用DLL庫並對t進行普通的usermode調用繼承人導出的功能。
出於這個原因,在Windows上你的shellcode必須:
- 硬編碼的Win32 API函數地址(最有可能將只有你的機器上工作)
- 使用Win32 API的解析器的shellcode(每工作Windows版本)
如果你只是在學習,現在只需要硬編碼你在調試器中看到的地址。要使呼叫位置獨立,您可以將地址加載到寄存器中。例如,調用帶有4個參數的函數:
PUSH 4 ; argument #4 to the function
PUSH 3 ; argument #3 to the function
PUSH 2 ; argument #2 to the function
PUSH 1 ; argument #1 to the function
MOV EAX, 0xDEADBEEF ; put the address of the function to call
CALL EAX
請注意,參數是按相反順序推入的。在CALL指令EAX包含返回值之後,堆棧就像之前一樣(即函數彈出自己的參數)。 ECX和EDX寄存器可能包含垃圾,所以不要依賴它們在通話後保留它們的值。
直接CALL指令將不起作用,因爲這些指令是位置相關的。
爲了避免零的地址本身嘗試任何針對x86的shellcode無空招數,也有很多在那裏,但我最喜歡的(雖然冗長)是使用XOR指令編碼值:
MOV EAX, 0xDEADBEEF^0xFFFFFFFF ; your value xor'ed against an arbitrary mask
XOR EAX, 0xFFFFFFFF ; the arbitrary mask
您也可以嘗試使用NEG EAX或NOT EAX(符號反轉和位翻轉)來查看它們是否工作,它便宜得多(每個兩個字節)。
你可以得到幫助,在不同的API函數可以調用的位置:http://msdn.microsoft.com
你需要的最重要的可能是以下幾點:
- 的WinExec():http://msdn.microsoft.com/en-us/library/ms687393(VS.85).aspx
- 的LoadLibrary():http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
- GetProcAddress的():http://msdn.microsoft.com/en-us/library/ms683212%28v=VS.85%29.aspx
第一次啓動一個命令,接下來的兩個是加載DLL文件並獲取其功能的地址。
下面是一個完整的教程編寫Windows的shellcode:http://www.codeproject.com/Articles/325776/The-Art-of-Win32-Shellcoding
- 1. 無法運行簡單的HelloWorld類
- 2. xll helloworld shellcode不打印任何東西
- 3. 需要簡單的幫助關於css
- 4. 需要條件打印helloworld
- 5. 簡單的AngularJS HelloWorld不起作用
- 6. 簡單LINQ需要
- 7. 建議需要:簡單的跨平臺(OS-X和Windows)+無需安裝
- 8. 簡單的答案需要:返回函數,返回null
- 9. 簡單的regex需要
- 10. 簡單的preg_match需要
- 11. 適用於Windows的簡單的,與編譯器無關的SCM?
- 12. Nodejs無法在簡單應用程序中獲取/ helloworld
- 13. PHP:用簡單的XML需要他!p
- 14. 簡單的android應用程序需要簡單的想法
- 15. 需要用於Eclipse的簡單PDF查看器
- 16. OSMDroid簡單示例需要
- 17. 簡單的麪包屑菜單需要
- 18. 適用於非編碼器的適用於Windows的簡單DVCS?
- 19. R來自C - 最簡單可能Helloworld
- 20. 我是否需要Shellcode的特定訂單?將此代碼轉換爲shellcode時,我做錯了什麼?
- 21. 需要一個關於Java中的隊列的簡單答案
- 22. 對於SQL Server的GetNextOrderNumber,需要非常簡單的'序列'
- 23. 基於Windows的iPhone SDK的需要
- 24. 關於創建表需要一個簡單的幫助
- 25. 需要關於簡單CSS工具提示的建議
- 26. 需要關於隨機答案的簡單測驗幫助
- 27. WPF C#。需要關於進度條的簡單幫助
- 28. 需要關於此通用鍵入的簡要說明
- 29. 需要簡單的css解析指導
- 30. 簡單的C++標籤庫需要
好,組裝操作碼是Linux和Windows一樣,這些教程事情應適用於窗口了。 – BlackBear 2011-01-09 17:57:58
彙編操作碼相同,但系統調用不同。有關更多詳情,請參閱下面的答案。 :) – MarioVilas 2013-01-13 15:26:03