最近幾天一直在調試一個非常奇怪的問題。爲在Windows上運行的i386構建的應用程序崩潰,並且調用堆棧的頂部完全損壞,指令指針位於無意義的位置。調用指令中的偏移量損壞
經過一番努力,我重建調用堆棧,並能確定IP如何在胡說的位置結束了。 boost共享指針代碼中的指令嘗試使用不正確的偏移量調用在我的DLL導入地址表中定義的函數。該指令看起來像:
call dword ptr [nonsense offset into import address table]
因此,執行結束在一個糟糕的位置,不幸的是,可執行。然後繼續執行,吞噬棧頂直到最終崩潰。
通過推出我的電腦上相同的應用程序,並步入了有問題的代碼,我可以找到相同的調用指令,看看通過調用msvc100的new操作符它應該。
而且比較來自客戶端的PC到我的電腦的轉儲,我發現我的電腦是用電話在地址表中的偏移0x0254功能。在客戶端PC上,代碼嘗試調用偏移量爲0x8254的函數。
什麼是更令人困惑的是,這個偏移不從寄存器或其他存儲位置來。偏移是反彙編中的一個常量。因此,拆卸的樣子:
call dword ptr [ 0x50018254 ]
不喜歡:
call dword ptr [ edx ]
有誰知道這件事會發生?
您已經發現了ASLR,地址空間佈局隨機化。旨在使惡意軟件難以修補程序的功能。尋找這樣的問題的更典型的原因:堆棧緩衝區溢出破壞了堆棧幀並覆蓋了返回地址。 –