2017-04-21 78 views
0

我想了解兩個不同的行爲,從Linux中的C程序(稱爲「weak_prog」)溢出,要求輸入,以便讓您溢出緩衝區。我明白,編譯器會以特定的方式佈局堆棧,有時會導致一些不可預測性。我無法理解的是,當我使用python腳本將20個字符添加到程序時,將緩衝區溢出時,處理內存的方式與手動運行vulnerable_prog並手動輸入20個字符相反。C程序字符緩衝區意外溢出

示例程序聲明瞭一個「char name [20]」的數組,並且目標是將其溢出並將特定值寫入另一個將被覆蓋的變量。 (這是來自經典的戰爭遊戲網站)。

我知道處理器(64位)每次讀取8個字節,所以這需要填充不是8的倍數的數組以保持內存的組織。因此,我的char [20]實際上佔用了24個字節的內存,並可以作爲8字節的字訪問處理器。 的意外行爲是這樣的:

當使用Python腳本,溢出行爲如下:

$python -c'print "A"*20 + "\xre\xhe\xyt\xhe"' | /path/vulnerable_prog 

的20個字符溢出緩衝器中,並且預期的值被寫入到存儲器中的正確的點。但是,當您嘗試通過從命令提示符運行程序並手動輸入20個字符,然後將所需的十六進制字符串寫入內存來溢出緩衝區時,必須使用一個額外的十六進制字符才能擁有你的價值最終會在正確的地方,你想要的:

$echo$ 'AAAAAAAAAAAAAAAAAAAA\xre\xhe\xyt\xhe\xaf' 

凡(的「回聲」,然後複製並粘貼到命令行中運行時vulnerable_prog提供提示輸出)在腳本和命令行exploitati之間的字符數組的填充中做了這種差異發揮作用? 我一直在做很多C結構填充和ISO/IEC 9899:201x閱讀的研究,但找不到任何可以解釋這種細微差別的東西。 (這是我的第一個關於堆棧溢出的問題,所以我很抱歉,如果我沒有正確地問這個問題)。

回答

0

你的Python腳本,當管道時,實際上發送了25個字符到/path/vulnerable_prog。 print語句添加一個換行符。這裏是你的Python程序加上計數寫到它的標準輸入字符小Python腳本:

python -c'print "A"*20 + "\xre\xhe\xyt\xhe"' | python -c "import sys; print(len(sys.stdin.read()))" 

我猜你不粘貼是來自echo到程序的提示換行符。不幸的是,我認爲我沒有足夠的信息來解釋爲什麼你需要25個而不是24個角色來實現你想要的。

P.S.歡迎來到堆棧溢出!

+0

非常感謝。我很高興你說你做了什麼關於我沒有粘貼來自echo輸出的換行符。我只是再玩一遍,不小心複製+粘貼兩種方式(帶和不帶換行符),並注意到其中的差異。這又向我指出了正確的方向,你的回答鞏固了我的一切。這個挑戰最近也被更新了,所以腳本方法似乎不再起作用,並且你必須手動利用它(否則我可能會提供更深入的瞭解爲什麼需要25個而不是24個) –