安全編譯選項

2021-10-09 23:01:33 字數 2221 閱讀 1946

alsr將程序的某些記憶體空間位址進行隨機化來增大入侵者**目的位址的難度,從而降低漏洞被成功利用的風險。

aslr要求執行程式被載入到記憶體時,它其中的任意部分都是隨機的。包括stack、heap、libs 、mmap、executable、linker和vdso(virtual dynamic shared object)

linux下alsr是否開啟取決於/proc/sys/kernel/randomize_va_space的值:

alsr配置的修改

//檢視

# sysctl -n kernel.randomize_va_space

# cat /proc/sys/kernel/randomize_va_space

//修改

# sysctl -w kernel.randomize_va_space=0

# echo 0 > /proc/sys/kernel/randomize_va_space

aslr有乙個模糊的值1,既不是全開啟也不是全關閉,而是部分關閉,那這部分到底是什麼,很容易產生歧義。

aslr 不負責**段以及資料段的隨機化工作,這項工作由 pie 負責。但是只有在開啟 aslr 之後,pie 才會生效。

pie是alsr實現的一部分,pie是開啟executable的隨機化,即可執行程式的**段和資料段隨機化。

$ gcc -o test test.c                // 可能會預設開啟pie,如果不預設開啟

$ gcc -no-pie -o test test.c // 關閉pie

$ gcc -fpie -pie -o test test.c // 開啟pie 強度為1

$ gcc -fpie -pie -o test test.c // 開啟pie 最高強度2

有如下程式

#include

int global =

1024

;int

main()

當關閉pie,可以看到資料段的全域性變數global的位址都是固定的

young@ubuntu:~/c$ gcc -no-pie test.c -o test

&&chmod u+x test

young@ubuntu:~/c$ ./test

0x601030

young@ubuntu:~/c$ ./test

0x601030

young@ubuntu:~/c$ ./test

0x601030

開啟pie,可以看到資料段的全域性變數global的位址都是隨機的

young@ubuntu:~/c$ gcc -fpie -pie test.c -o testwithpie &&

chmod u+x testwithpie

young@ubuntu:~/c$ ./testwithpie

0x55af44e03010

young@ubuntu:~/c$ ./testwithpie

0x55cb1193b010

young@ubuntu:~/c$ ./testwithpie

0x55ebe1526010

pic和pie類似,與pie不同的是pic作用在executable的動態鏈結方面

$ gcc -no-pic -o test test.c        // 關閉pic

$ gcc -fpic -o test test.c // 開啟pic 強度為1 不會開啟pie

$ gcc -fpic -o test test.c // 開啟pic 最高強度2 不會開啟pie

pie和pic都是實現alsr的一部分,它們的區別是:

一般是使用 glibc 中的 malloc() 類介面分配記憶體,通過 man 3 malloc 可以發現其中有相關的介紹,也就是當超過了 mmap_threshold 大小後會使用 mmap(),否則使用 brk() 申請。

如果當前 aslr 等級為 1,那麼當申請空間大於 128k 時,系統通過 mmap() 分配空間,得到的位址是隨機的;而當申請空間小於 128k 時,系統是通過 brk() 進行分配的,得到的位址是靜止的。

gcc 安全編譯選項

linux程式的常用保護機制

VC編譯選項

vc編譯選項 od 禁用優化 預設值 disable optimizations default ox 最大化選項。ogityb2 gs maximum opts.ogityb1 gs og 啟用全域性優化 enable global optimization oy 啟用框架指標省略 enable ...

PHP編譯選項

編譯擴充套件庫 usr local php bin phpize configure with php config usr local php bin php config make make install ln s ext sockets modules sockets.so sockets....

GCC編譯選項

gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器ld 引數詳解 c 只啟用預處理,編譯,和彙編,也...