2010-10-20 59 views
2

ldd顯示器,其中共享庫在運行時間加載庫的隨機存儲器地址的需求是什麼?

$ cat one.c 
#include<stdio.h> 

int main() { 
    printf ("%d", 45); 
} 
$ gcc one.c -o one -O3 
$ ldd one 
    linux-gate.so.1 => (0x00331000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bc2000) 
    /lib/ld-linux.so.2 (0x006dc000) 
$ 

this answer從另一個問題鏈接的存儲器地址,

...的地址是基本上隨機數。在設計安全實現之前,ldd會始終指示程序部分加載的內存地址。大約五年前,現在許多Linux都故意隨機化加載地址,以阻止潛在的病毒編寫者等。

我不完全瞭解這些內存地址如何用於利用。

是對類似問題,或者是它的東西比這更「如果地址是固定的,一個可以,如果它是一個庫,將同該地址把一些不良代碼」?

回答

3

是「如果地址是固定的,一個可以,如果它是一個庫,將同該地址把一些不良代碼」。

另外。緩衝區溢出攻擊需要一個一致的內存模型,以使溢出緩衝區的字節知道代碼的已知部分。

http://www.corewars.org/的原則,一個偉大的例證。

1

的典型方法是通過緩衝區溢出,在那裏你把堆在一個特定的地址,然後返回。通常,您可以挑在它假定你已經通過了它的堆棧已經檢查了參數的內核地址,所以它只是使用它們沒有任何進一步的檢查,讓你做的事情,通常不會被允許。

3

有些漏洞允許覆蓋某些地址(堆棧溢出允許覆蓋返回地址,利用堆溢出通常覆蓋Win32上的SEH指針和Linux上動態調用函數的地址(GOT條目)...)。因此,攻擊者需要將覆蓋的地址指向一些有趣的地方。爲了使這更困難,一些反制措施已被採納:

  • 非可執行堆棧防止攻擊從僅僅跳躍到一些代碼,攻擊者已經把堆棧。
  • W¯¯^ X段(段可以從未是可寫和可執行同時)防止對其它存儲器區域中的相同。
  • 圖書館和位置無關的可執行文件隨機加載地址通過返回到-libc的減少成功的剝削的概率和返回導向編程技術,...
  • 隨機加載地址還可防止攻擊者事先知道在哪裏發現一些有趣的功能(例如:想象一下,攻擊者可以覆蓋消息的下一個記錄通話的GOT入口和部分,知道的system的地址將是「有趣」)。

因此,您必須將加載地址隨機化視爲許多(幾層防禦和所有這些)之間的另一個對抗措施。

另請注意,漏洞利用不限於任意代碼執行。獲得一個程序來打印一些敏感信息而不是(或者除了考慮到字符串截斷錯誤),一些非敏感信息也被視爲漏洞利用;用這種漏洞編寫一些概念驗證程序並不困難,因爲知道絕對地址會使可靠的漏洞成爲可能。

你應該看看回歸到libc和返回導向編程。這些技術大量使用可執行文件和庫中地址的知識。

最後,我會注意到有兩種方式隨機庫加載地址:

  • 做它在每一個負荷:這使得(一些)利用不可靠,即使攻擊者可以獲取有關地址信息一次運行並嘗試在另一次運行中使用該信息。
  • 每個系統都做一次:這是prelink -R的功能。它避免了使用通用信息的攻擊者,例如:所有Redhat 7.2盒子。顯然,它的優點是它不會影響預鏈接:)。
2

一個簡單的例子:

如果一個流行的操作系統的標準C庫總是加載地址0x00100000和最近的標準C庫的版本有system功能偏移量0x00000100那麼如果有人能夠利用此操作系統(如Web服務器)在計算機上運行的程序中的缺陷導致它將一些數據寫入堆棧(通過緩衝區溢出),他們會知道如果他們寫了0x00100100到當前函數預期其返回地址的堆棧上的位置,然後它們可以使得它從當前函數返回時system函數將是ca LLED。儘管他們仍然沒有做任何事情來促使system執行他們想要的東西,但它們很接近,並且在上面提到的地址中寫入更多東西到堆棧中有一些技巧,這很有可能導致有效的字符串指針和通過強制調用system運行的命令(或一系列命令)。

通過隨機化加載庫的地址,攻擊者更有可能使Web服務器崩潰而不是獲取系統控制權。

相關問題