2010-11-03 106 views
1

我正在處理一個二進制文件。它有一個地址從123開始的函數。我需要讓我的代碼執行這個函數。攻擊堆棧

二進制文件接受大小爲'n'的字節數組,並且不檢查邊界。整個任務實際上是溢出緩衝區並導致不好的事情發生。

同樣,工作是調用地址123並讓它執行。我的印象是,如果緩衝區大小是「4」,並且我傳遞了9個字符,則5個字符將被放置在堆棧上並執行。 (這是真的嗎?)

此外,爲了讓我得到要執行的地址,我想說「致電123」。從我所瞭解的「電話」是「e8」,不是?

這個問題對我來說有點困惑。如果有人可以幫助我更好地理解它,我將非常感激

(是的,這是一個家庭作業問題)

+0

0xE8是相對調用,你需要調用一個絕對地址。堆棧通常是「浮動」的。 – ruslik 2010-11-03 02:25:00

+3

我希望我們有這些家庭作業.. – ruslik 2010-11-03 02:26:09

+0

只是有點好奇 - 我會認爲像這樣的安全類會有一個彙編語言的先決條件。這是怎麼回事? – 2010-11-03 03:04:33

回答

1

堆棧不包含代碼,但它確實包含該函數的返回地址。典型的堆棧結構是:

<stack data> <old frame pointer> <return address> 

<old frame pointer>有時省略,我認爲將不得不爲這個,所以你必須提供的是數據,填補了數組,那麼123

+0

用於提及棧上的返回地址。 – casablanca 2010-11-03 02:52:15

0

一個常見的策略是在固定的存儲器地址中找到一個call ESP操作碼,並用此地址覆蓋返回地址。這樣執行將繼續在堆棧上。如果沒有DEP激活(或支持),它將工作。

在你的情況下,你也可以在內存中尋找abs_jump 123

編輯: @Loren它只有在可以執行堆棧時纔有效。 call esp只有兩個字節的操作碼,所以很有可能在內存中找到它。第二種方法不會從堆棧執行代碼,但需要5個字節的操作碼,這是不太可能找到的。

+0

或將其作爲用於粉碎堆棧的數據的一部分提供。 – 2010-11-03 03:07:33