2012-05-25 83 views
0

我學習了明天要考試,我碰到這個問題跑了:libc.so MMAP strace的

我們運行與strace的下列系統調用的可執行文件後的結果有關標準的C lib目錄下:

  • 開放(」 /lib/libc.so.6" , 「O_RDONLY」)= 3
  • MMAP(NULL,36803630,PROT_READ | PROT_EXEC,MAP_PRIVATE | MAP_DENYWRITE,3,0)= 0x7f312ab35000
  • MMAP(0x7f312aeae000,20480,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE,3 ,0x179000)= 0x7f312aeae000

問題是爲什麼mmap的第一個系統調用使用PROT_READ | PROT_EXEC,第二個是PROT_READ | PROT_WRITE。

請詳細解釋每次mmap調用後會發生什麼情況。我不明白爲什麼一個進程需要修改libc(寫入權限)。

回答

1

該地圖是私人的(MAP_PRIVATE),所以沒有任何修改libc.so;相反,它正在修改從libc.so映射的頁面的私人(到過程)副本。這將包括數據段(libc中的全局變量)以及全局偏移表(GOT)以及在運行時將庫重定位到特定地址所涉及的其他結構。

+0

爲什麼PROT_EXEC消失? –

+0

數據不需要可執行;它是數據,而不是代碼。並且使可寫內存可執行文件被認爲是一種安全風險,因爲它通過允許攻擊者放置代碼而擴展了可以提升爲任意代碼執行的漏洞類別。許多強化系統甚至不允許同時寫入執行權限的內存映射。 –