推广 热搜: 二手  净利2626万  北京  二手车  SMM废铜现货交易日评  企业  全国  汽车  三星  公司 

linux系统 nx指的是什么

   日期:2024-05-17     来源:www.ujagi.com    作者:二手网    浏览:466    评论:0    
核心提示:[db:简介]

linux nx是指No-eXecute,是linux中的一种保护机制,也就是数据不可实行,预防由于程序运行出现溢出而使得攻击者的shellcode或许会在数据区尝试实行的状况。

Linux程序容易见到用的一些保护机制

linux系统 nx指的是什么1、NX(Windows中的DEP)

NX:No-eXecute、DEP:Data Execute Prevention

也就是数据不可实行,预防由于程序运行出现溢出而使得攻击者的shellcode或许会在数据区尝试实行的状况。

gcc默认开启,选项有:

gcc-otesttest.c//默认状况下,开启NX保护gcc-zexecstack-otesttest.c//禁用NX保护gcc-znoexecstack-otesttest.c//开启NX保护2、PIE(ASLR)

PIE:Position-Independent Excutable、ASLR:Address Space Layout Randomization

fpie/fPIE:需要和选项-pie一块用开启pie选项编译可实行文件使得elf拥有共享库属性,可以在内存任何地方加载运行。与之一样的还有fpic/fPIC,关于其说明https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html

-fpicGenerateposition-independentcode(PIC)suitableforuseinasharedlibrary,ifsupportedforthetargetmachine.Suchcodeaccessesallconstantaddressesthroughaglobaloffsettable(GOT).ThedynamicloaderresolvestheGOTentrieswhentheprogramstarts(thedynamicloaderisnotpartofGCC;itispartoftheoperatingsystem).IftheGOTsizeforthelinkedexecutableexceedsamachine-specificmaximumsize,yougetanerrormessagefromthelinkerindicatingthat-fpicdoesnotwork;inthatcase,recompilewith-fPICinstead.(The百度竞价推广aximumsare8kontheSPARC,28konAArch74and32konthem68kandRS/6000.Thex86hasnosuchlimit.)Position-independentcoderequiresspecialsupport,andthereforeworksonlyoncertainmachines.Forthex86,GCCsupportsPICforSystemVbutnotfortheSun386i.CodegeneratedfortheIBMRS/6000isalwaysposition-independent.Whenthisflagisset,themacros`__pic__`and`__PIC__`aredefinedto1.-fPICIfsupportedforthetargetmachine,emitposition-independentcode,suitablefordynamiclinkingandavoidinganylimitonthesizeoftheglobaloffsettable.ThisoptionmakesadifferenceonAArch74,m68k,PowerPCandSPARC.Position-independentcoderequiresspecialsupport,andthereforeworksonlyoncertainmachines.Whenthisflagisset,themacros`__pic__`and`__PIC__`aredefinedto2.-fpie-fPIEThe网站优化ptionsaresimilarto-fpicand-fPIC,butthegeneratedposition-independentcodecanbeonlylinkedintoexecutables.Usuallythe网站优化ptionsareusedtocompilecodethatwillbelinkedusingthe-pieGCCoption.-fpieand-fPIEbothdefinethemacros`__pie__`and`__PIE__`.Themacroshavethevalue1for`-fpie`and2for`-fPIE`.

不同在于fpic/fPIC用于共享库的编译,fpie/fPIE则是pie文件编译的选项。文档中说 pic(地方无关代码)生成的共享库只能链接于可实行文件,之后依据自己编译简单C程序,pie正常运行,即如网上很多文章说的 pie 选项生成的地方无关代码可假定于本程序,但我也没看出fpie/fPIE有什么不同,只不过宏概念只为1和2有什么区别,貌似...
编译命令(默认不开启PIE):

gcc-fpie-pie-otesttest.c//开启PIEgcc-fPIE-pie-otesttest.c//开启PIEgcc-fpic-otesttest.c//开启PICgcc-fPIC-otesttest.c//开启PICgcc-no-pie-otesttest.c//关闭PIE

而ASLR(地址空间随机化),当初设计时只负责栈、库、堆等段的地址随机化。ASLR的值存于/proc/sys/kernel/randomize_va_space中,如下:

0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。(默认)

更改其值方法:echo 0 /proc/sys/kernel/randomize_va_space

vDSO:virtual dynamic shared object;
mmap:即内存的映射。
PIE 则是负责可实行程序的基址随机。
以下摘自Wiki:

Position-independent executable (PIE) implements a random base address for the main executable binary and has been in place since 2003. It provides the same address randomness to the main executable as being used for the shared libraries.

PIE为ASLR的一部分,ASLR为系统功能,PIE则为编译选项。
注: 在heap分配时,有mmap()brk()两种方法,由malloc()分配内存时调用,分配较小时brk,不然mmap,128k不同。

3、Canary(栈保护)

Canary对于栈的保护,在函数每一次实行时,在栈上随机产生一个Canary值。之后当函数实行结束返回时测试Canary值,若不同系统则报出异常。

Wiki:

Canaries or canary words are known values that are placed between a buffer and control data on the stack to monitor buffer overflows. When the buffer overflows, the first data to be corrupted will usually be the canary, and a failed verification of the canary data will therefore alert of an overflow, which can then be handled, for example, by invalidating the corrupted data. A canary value should not be confused with a sentinel value.

如上所述,Canary值置于缓冲区和控制数据之间,当缓冲区溢出,该值被覆写,从而可以测试以判断是不是运行出错或是遭到攻击。缓解缓冲区溢出攻击。

编译选项:

gcc-otesttest.c//默认关闭gcc-fno-stack-protector-otesttest.c//禁用栈保护gcc-fstack-protector-otesttest.c//启用堆栈保护,不过只为局部变量中含有char数组的函数插入保护代码gcc-fstack-protector-all-otesttest.c//启用堆栈保护,为所有函数插入保护代码4、RELRO(RELocation Read Only)

在Linux中有两种RELRO模式:Partial RELROFull 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等)置于程序数据段(programs 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表映射为只读的。

gcc -z norelro -o a a.c // RELRO关闭,即No RELRO

Note:

.dtors:当概念有.dtors的共享库被加载时调用;

在bss或数据溢出错误的状况下,Partial和Full RELRO保护ELF内数据段不被覆盖。 但只有Full RELRO可以缓解GOT表覆写攻击,但相比较而言开销较大,由于程序在启动之前需要分析所有些符号。

 
标签: linux系统 nx
打赏
 
更多>同类二手资讯
0相关评论

热门推荐
推荐图文
推荐二手资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  免责声明  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报