Linux保護機制


  • RELRORELocation 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 //
啟用堆棧保護,為所有函數插入保護代碼 

   

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM