2012-02-19 124 views
-1

我有一個任務告訴我,我需要通過從堆棧運行代碼來執行緩衝區溢出。我一直在嘗試這樣做,但每次我將堆棧的「ret」位置替換爲我希望代碼駐留的堆棧的位置時,它都會導致seg錯誤。如果我用物理.o文件中存在的地址(如物理彙編代碼)替換「ret」位置,它可以正常工作。你不允許回到棧上的位置嗎?我很困惑,如果你不能返回到堆棧地址,你可以用自己的彙編代碼執行緩衝區溢出......(順便說一下,我使用的是IA32小端機)。緩衝區溢出攻擊 - 返回堆棧地址?

我的步驟:

  1. 溢出的32字符緩存器(將所有FF)
  2. 覆蓋的%ebp位置(與存儲在那裏的實際值)
  3. 覆蓋它上面的 「RET」 斑用堆棧中的地址而不是程序集文件中的地址
  4. 注入我的程序集字節碼(我確保我在開始時添加nop指令以確保它以4字節的倍數完成)
  5. 運行

,這導致了賽格故障

回答

4

確保棧頁面被標記爲可執行文件;現代操作系統通常會將堆棧設置爲不可執行,因此當您將程序設置爲它時,會立即發生段錯誤。

+0

我覺得這個任務,我們假設堆棧被標記爲可執行文件(否則他們不會給我們像一個分配這個)。任何其他想法?謝謝。 – de1337ed 2012-02-19 21:10:26

1

這在很多方面取決於平臺。並非所有的內存都是可執行的,而在現代系統中,通常存在可寫的內存與可執行的內存之間的排他性或內存,正是出於這些原因。如果您使用的是linux,您可能需要額外調用mprotect來構建堆棧,因此您需要將堆棧更改爲可執行文件。這將需要更復雜和構造的有效載荷,但是可行。

其他選項是你在返回地址後面的參數仍然有問題,這意味着你可能對其他函數的調用「很幸運」,因爲你沒有破壞堆棧,但是當你注入你的代碼,你做到了。

對於進一步閱讀:

  1. NX bit
  2. mprotect