pwntools緩衝區溢位與棧沒對齊

muyiGin發表於2024-08-12

我是ubuntu22.04,遇到了極其詭異的事情:

可真是氣死我了,got EOF是在逗我?怎麼就EOF了?怎麼就到end of file了?

下面請欣賞大佬的講解:

以下貼上gpt更詳細的解答,我這次深刻的記住了棧要16位元組對齊(我以前一直以為這只是為了提高效率的,可選可不選,無非慢一點)
當棧沒有對齊且試圖開啟一個 shell 時,提示 “got EOF” 通常與棧未對齊導致程式崩潰或不穩定執行有關。這裡是一個更深入的解釋:

棧對齊的重要性

在許多系統(特別是 x86_64 架構)中,棧的對齊對函式呼叫和系統呼叫的正確執行非常重要。通常,棧必須以 16 位元組對齊。這是因為現代處理器在處理對齊資料時效能更好,且某些 SIMD 指令集(如 SSE)要求棧必須是 16 位元組對齊的。

棧未對齊的影響

當棧未對齊時,呼叫某些函式或系統呼叫可能會導致未定義行為或崩潰。這是因為函式可能依賴於棧上的資料具有正確的對齊方式,如果不滿足這個條件,函式執行可能會導致記憶體訪問錯誤,或者由於無法正確訪問所需資料,直接導致程式退出。

EOF 與棧未對齊

在某些情況下,當你試圖在一個棧未對齊的環境中開啟一個 shell 時,程式可能會崩潰。在 Exploit 開發中,這可能是因為返回到 shellcode 的執行發生了錯誤。如果程式崩潰並關閉檔案描述符或終止了與 shell 的通訊,會導致 shell 的標準輸入流結束,這時會觸發 “EOF”(End of File) 的訊息。此時,EOF 並不是你通常意義上的檔案結束,而是一個指示通訊通道關閉的錯誤。

解決方法

為避免此類問題,在執行 exploit 時,確保棧的對齊是正確的。通常,在呼叫 shellcode 前,手動對齊棧,確保它是 16 位元組對齊的。例如,在手動編寫 shellcode 或構造 ROP 鏈時,特別注意棧指標的對齊。

這是在進行漏洞利用時需要注意的細節之一,正確處理能夠避免不必要的程式崩潰和異常行為。

相關文章