2011-12-03 52 views
2

我正在處理一個處理溢出緩衝區(緩衝區溢出炸彈)的學校項目。我相信你們中的許多人已經做過或聽說過它。我不是在尋找如何去做,而只是有一個關於回報的普遍問題。是否有可能返回到堆棧上的地址?我只問,因爲這似乎是解決階段最合乎邏輯的方式,但它保持segfaulting,這通常發生在嘗試訪問「沙盒」之外的內存時,但我認爲該堆棧可供我的程序訪問,因爲它不是真是一個共同的問題查找我估計有人在這裏可能知道返回到堆棧上的地址

我應該提到的程序設計,讓你從堆棧中執行代碼

感謝

+1

這是一個已經關閉了一段時間的漏洞。被稱爲「DEP(數據執行預防)」和「NX(不執行)位」。它阻止映射堆棧的內存頁面具有可執行代碼。你將不得不關掉這個工作,希望有實際的工作。或者挖掘一臺真正的舊機器。詢問superuser.com,操作系統配置不在這裏的話題。 –

回答

1

在x86,返回到位置堆棧:

LEA EAX, offset[ESP] 
    JMP EAX 

正如其他人指出的那樣,數據執行保護可以防止處理器 從在堆棧區域中實際執行一旦JMP具有執行。

要返回堆棧指定其地址的位置:

JMP offset[ESP] 

同樣,如果目標位置是「數據頁」,DEP將阻止執行。 (您可以打電話給Windows並刪除該數據上的DEP;我不確定您是否可以使用 對堆棧執行此操作。)

1

當然,你可以返回來解決堆棧中。但是,如果堆棧內存不可執行(取決於CPU功能和操作系統),則會發生內存訪問衝突異常。

0

正常情況下,處理器指令集和編譯器使用的調用約定相結合。有些處理器只會使用堆棧中的地址返回,其他處理器可能只能使用其他寄存器中的地址,有些則由編程人員決定。當然,如果你希望彈出堆棧的地址,而只註冊分支類型的處理器,或者從堆棧中只有一個類型的處理器的寄存器中放置一個地址,你可以自然選擇。

像x86這樣的舊設計通常會有調用指令將返回地址放在堆棧上,並且返回指令將返回地址從堆棧中拉出以使用它。在x86中,CS也可能在堆棧中。處於這個類別的處理器通常會將標記放置在堆棧上進行中斷,並且從中斷返回將彈出標記和返回地址。

基於處理器規則,您可以選擇從函數返回的方式,因此會進行約定以使所有函數都使用相同的規則,並且編譯器使用該約定。

您需要知道您使用的處理器稍微好一些,以及您嘗試使用或利用的調用約定。