[英]Why aren't glibc's function addresses randomized when ASLR is enabled?
在嘗試理解ASLR時,我構建了這個簡單的程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("%p\n", &system);
return 0;
}
似乎啟用了ALSR:
$ cat /proc/sys/kernel/randomize_va_space
2
我使用GCC編譯程序:
$ gcc aslrtest.c
每次運行此程序時,它都會打印相同的地址( 0x400450
)。
如果glibc在隨機地址加載,我希望這個程序每次都打印一個不同的地址。 這對我來說是令人驚訝的,特別是考慮到防止返回libc攻擊應該是ASLR(特別是system()
調用)的主要動機。
我期望system()
的地址應該是隨機的嗎? 或者我的配置可能有問題?
從主程序中的非位置無關的目標文件對共享庫中的函數的任何引用都需要PLT條目,調用者可以通過該條目通過在鏈接時解析為固定地址的調用指令進行調用。 。 這是因為目標文件沒有使用特殊代碼(PIC)構建,以使其能夠支持在變量地址處調用函數。
每當這樣的PLT條目用於庫中的函數時,該PLT條目的地址,而不是函數的原始地址,就成為其“官方”地址(如在您打印system
地址的示例中)。 這是必要的,因為必須以相同的方式從C程序的所有部分看到函數的地址。 system
地址的語言不允許根據程序的哪個部分來查看它,因為這會破壞兩個指向同一函數的指針相等的規則。
如果您真的希望從使用已知固定地址調用函數的攻擊中獲得ASLR的好處,則需要將主程序構建為PIE。
實際上是printf("%p\\n", &system);
它不打印它實際打印system@plt
地址的libc地址,該地址不是由ASLR隨機化的
但它確實隨機化了libc地址,最終保護了ret2libc攻擊!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.