2014-05-12 61 views
2

我有一個程序,argv [0]不時被覆蓋。這發生(僅)在我無法訪問的生產機器上,以及我無法使用調試器的地方。爲了找到這種腐敗的起源,我想寫保護這個堆棧頁面,以便任何寫入訪問都會出錯,並且我可以得到罪魁禍首指令的地址。在AIX上寫保護堆棧頁面?

該系統是基於AIX 5.3 64位的。當我嘗試調用堆棧頁面上的mprotect時,出現ENOMEM錯誤。我使用gcc來生成我的程序。

在Linux系統(基於x86)上,我可以使用mprotect設置類似的保護而沒有麻煩。

有什麼辦法可以在AIX上實現這一點。或者這是一個無望的嘗試?

+0

http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.basetechref/doc/basetrf1/mprotect.htm - 考慮到您似乎是僅限於已經mmap'd的頁面(以及其他一些內容),我懷疑你可以更改堆棧保護模式。 (但我對此不夠熟悉,不能回答。) – Mat

回答

0

在AIX上,mprotect()要求所請求的頁面僅爲共享內​​存或內存映射文件。在AIX 6.1 and later上,可以使用MPROTECT_TXT環境變量將其擴展到文本區域,共享庫等。

但是,您可以在XLC 11/AIX 6.1TL4及更高版本上使用-qstackprotect option。 「Stack Smashing Protection」旨在防止您描述的情況發生。

在AIX 5.3上,我唯一的建議是使用像Parasoft's Insure++這樣的工具集來研究構建。它會在運行時找到錯誤的寫入到您的堆棧。這幾乎是AIX開發業務中最好的(現在也是唯一的)工具。我們在室內使用它,當您需要它時,它非常寶貴。

0

爲了記錄,此問題的解決方法是將處理轉移到pthread線程。在AIX上,pthread線程堆棧位於可以被保護的數據段中(與原始線程不同,它不能被保護)。這是AIX上的JVM(OpenJDK)實現堆棧守衛的方式。