簡體   English   中英

C程序char緩沖區意外溢出

[英]C program char buffer unexpected overflow

我試圖從Linux中的C程序(稱為脆弱性_程序)中了解兩種不同的溢出行為,該行為要求輸入,以便允許您溢出緩沖區。 我了解編譯器會以特定方式對堆棧框架進行布局,有時會導致一些不可預測性。 我不明白的是,當我使用python腳本溢出緩沖區以向程序提供20個字符時,處理內存的方式有所不同,這與手動運行弱勢_prog和手動輸入20個字符相反。

示例程序聲明了一個數組“ 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'

(然后將'echo'的輸出復制並粘貼到從命令行運行時,unable_prog提供的提示中)

腳本和命令行利用之間的字符數組填充差異在哪里發揮作用? 我一直在研究C結構填充和在ISO / IEC 9899:201x中進行閱讀 ,但是找不到任何可以解釋這種細微差別的內容。 (這是我關於堆棧溢出的第一個問題,因此,如果我不太正確地提出這個問題,我深表歉意。)

您的Python腳本通過管道傳輸后,實際上會將25個字符發送到/path/vulnerable_prog 打印語句添加換行符。 這是您的Python程序以及一個小的Python腳本,該腳本計算寫入標准輸入中的字符:

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

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

PS歡迎使用堆棧溢出!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM