-
RELRO(RELocation Read Only)
在Linux中有兩種RELRO模式:"Partial RELRO" 和 "Full RELRO"。Linux中Partical RELRO默認開啟。
Partial RELRO:
編譯命令:
gcc -o test test.c // 默認部分開啟
gcc -Wl,-z,relro -o test test.c // 開啟部分RELRO
gcc -z lazy -o test test.c // 部分開啟
- 該ELF文件的各個部分被重新排序。內數據段(internal data sections)(如.got,.dtors等)置於程序數據段(program's data sections)(如.data和.bss)之前;
- 無 plt 指向的GOT是只讀的;
- GOT表可寫(應該是與上面有所區別的)。
Full RELRO:
編譯命令:
gcc -Wl,-z,relro,-z,now -o test test.c // 開啟Full RELRO
gcc -z now -o test test.c // 全部開啟
- 支持Partial模式的所有功能;
- 整個GOT表映射為只讀的。
-
NX(windows中得DEP)
NX:No-eXecute
DEP:Data Execute Prevention
也就是數據不可執行,防止因為程序運行出現溢出而使得攻擊者的shellcode可能會在數據區嘗試執行的情況。
GCC默認開啟(可選項如下)
gcc -o test test.c // 默認情況下,開啟NX保護
gcc -z execstack -o test test.c // 禁用NX保護
gcc -z noexecstack -o test test.c // 開啟NX保護
繞過方法:
使用 ROP繞過 (如ret2data、ret2libc、ret2strcpy、ret2gets、ret2syscall)
gadget:virtualprotect、jmp esp、mona.py
-
Fority
-
PIE(ASLR)
PIE:Position-Independent Excutable
可執行程序得基址隨機,為aslr得編譯選項,是aslr得一部分
ASLR:Address Space Layout Randomization
地址空間隨機化
GCC默認不開啟(可選項如下)
gcc -fpie -pie -o test test.c // 開啟PIE
gcc -fPIE -pie -o test test.c // 開啟PIE
gcc -fpic -o test test.c // 開啟PIC
gcc -fPIC -o test test.c // 開啟PIC
gcc -no-pie -o test test.c // 關閉PIE
繞過方法:
1、直接RET替換(一般進程也會加載沒有隨機化的模塊,可以找到JMP ESP指令的跳板直接調用)
2、替換EIP一部分(找到沒有隨機化的模塊然后使用利息泄漏確定EIP的位置,再算出模塊的基地址,最后算出要跳的函數地址)
3、NOP噴射(DEP沒開的情況下,創建一大塊NOP+shellcode,Heap Spray是在shellcode的前面加上大量的slide code(滑板指令),組成一個注入代碼段。 然后向系統申請大量內存,並且反復用注入代碼段來填充。這樣就使得進程的地址空間被大量的注入代碼所占據。然后結合其他的漏洞攻擊技術控制程序 流 ,使得程序執行到堆上,最終將導致shellcode的執行。
統slide code(滑板指令)一般是NOP指令,譬如0x0C(0x0C0C代表的x86指令是OR AL 0x0C),0x0D等等,不影響程序的執行的。)
4、暴力(如果漏洞不會造成程序崩潰,可以暴力測試256種模塊基地址來測試,只到有滿足的)最LOW
-
Canary(棧保護)
Canary對於棧的保護,在函數每一次執行時,在棧上隨機產生一個Canary值。之后當函數執行結束返回時檢測Canary值,若不一致系統則報出異常。
編譯選項:
gcc -o test test.c //默認關閉
gcc -fno-stack-protector -o test test.c //禁用棧保護
gcc -fstack-protector -o test test.c //啟用堆棧保護,不過只為局部變量中含有 char 數組的函數插入保護代碼
gcc -fstack-protector-all -o test test.c //啟用堆棧保護,為所有函數插入保護代碼