2011-07-19 76 views
12

我想了解代碼漏洞,並正在測試我編寫的一些簡單程序。然而,Glibc在運行時遇到的許多問題(例如堆棧碎片,雙倍空閒等)。因此,我希望能夠在沒有Glibc運行時檢測錯誤的情況下運行我的程序。有沒有辦法關閉Glibc的檢測? (如使用編譯器標誌等)。如何關閉Glibc運行時保護?

我在前面的鏈接中看到如何關閉ASLR和Canaries,但這不是我想要做的,因爲它仍然會停止像Double Free和其他一些堆錯誤我想要的錯誤試試(http://stackoverflow.com/questions/2340259/how-to-turn-off-gcc-compiler-optimization-to-enable-buffer-overflow)。

我也知道你可以用-w標誌關閉編譯時警告,但這似乎並不是我想要的。我試着閱讀GCC標誌並查閱有關Glibc的信息,但我還沒有到任何地方。因此,我將不勝感激任何幫助。謝謝。

回答

24

檢查malloc(3)的手冊頁以獲取MALLOC_CHECK_環境變量的用法。使用這個,你可以關閉'aborts'來解決那些雙重的免費錯誤和不適合玩的東西。

man malloc 

所以,如果你的程序被稱爲「badfree」,你可以設置MALLOC_CHECK_(注結尾下劃線)與export命令,或者只是將其設置badfree的每次執行。

export MALLOC_CHECK_=0 
./badfree 

- 或 -

MALLOC_CHECK_=0 ./badfree 

只要記住,如果你使用第一種方法,它被設置爲您在shell中運行任何程序。

的設置MALLOC_CHECK_從的malloc(3)手冊頁是:

MALLOC_CHECK_ = 
0 Silently ignore any issues 
1 Send error message to stderr 
2 abort() is called immediately, killing your program. 
3 Do both '1' and '2' (MALLOC_CHECK_ is a bitfield) 
+0

這與您所說的完全相同。非常感謝你的幫助。 – Billy

+1

不錯的一個人。好問題,很好的答案。:)歡呼聲。 –

+0

無論如何要在運行時做到這一點?我的意思是,沒有環境變量,函數或C定義。 –

-1

你至少應該能夠在編譯時有

-fno-stack-protector 

關閉堆棧保護

編輯:對不起,剛纔看到的,這是不夠的,你

隱而不宣」這似乎很容易,因爲glibc對於所有程序都是全球性的,所以如果你可以關閉保護,那將是非常糟糕的。 我的建議是安裝一個沒有堆保護的舊版Linux發行版(2003年中期或更早版本應該可以)。

+0

我一直在到處尋找,但無法找到任何東西。我找到的唯一的其他標誌是FORTIFY_SOURCE,但那對我也沒有幫助。會安裝一個真正舊版的gcc工作,還是你真的需要做整個發行版? – Billy

+0

我認爲,因爲glibc是你發行版的核心部分,所以安裝舊版本的gcc是不夠的。 但是,使用VirtualBox或類似的東西,即使安裝整個發行版也很麻煩。 – Daniel

+0

「黑客攻擊的藝術」一書。例如Jon Erickson所包含的Linux發行版沒有保護機制來嘗試不同的黑客行爲。我將它安裝在VirtualBox中,啓動速度非常快。 – Daniel

0

您可以重載operator newoperator delete,但這不會幫助使用mallocfree的程序。當然,你也可以編寫自己的實現,但是在一些操作系統上,重載C庫函數可能會有一定難度。

從概念上講,雙免費和free (unallocated_pointer)之間的區別是什麼?

+0

也許我還沒有關注,但是如何重載new/delete會幫助我?我想我忘了明確地注意到這一點,但是當我在處理C代碼時,Double Free出現了。 – Billy

+0

我想你忘了提及!您還忘記提及您的意圖:您是否正在嘗試編寫檢測漏洞的工具,或者您是否嘗試編寫漏洞? –

+0

在很多機器上,有**沒有**選項可以完成編譯器的功能,因爲C標準庫不是編譯器的一部分。標準庫是系統的一部分。例如,它與Linux和Mac OSX上的系統捆綁在一起。 GNU編譯器收集依賴於此。標準庫不是gcc的一部分。 –

相關問題