2011-01-09 55 views
0

我想通過編寫「Hello World」到控制檯(使用Windows XP 32位)來測試緩衝區溢出。 shellcode需要是無空的,以便通過「scanf」傳遞到我想溢出的程序中。我發現很多Linux的彙編教程,但是沒有一個適用於Windows。有人可以請我通過這個使用NASM? Thxxx!用於Windows的簡單「Hello-World」,無null shellcode需要

+0

好,組裝操作碼是Linux和Windows一樣,這些教程事情應適用於窗口了。 – BlackBear 2011-01-09 17:57:58

+0

彙編操作碼相同,但系統調用不同。有關更多詳情,請參閱下面的答案。 :) – MarioVilas 2013-01-13 15:26:03

回答

0

彙編語言由您的處理器定義,彙編語法由彙編器定義(因此,在& 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執行。

快樂黑客...

1

大會的操作碼是相同的,所以正規的招數仍然生產無空的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

你需要的最重要的可能是以下幾點:

第一次啓動一個命令,接下來的兩個是加載DLL文件並獲取其功能的地址。

下面是一個完整的教程編寫Windows的shellcode:http://www.codeproject.com/Articles/325776/The-Art-of-Win32-Shellcoding