虚拟机环境:Ubuntu 14.04(x86)
本文是基于sploitfun系列教程的详细解析,sploitfun对于纯新手而言,其中有些东西还是不够详细,新手不能很好的接触到其中原理,故作此文进行补充
编译代码第一行,表示关闭ASLR(地址空间布局随机化)。kernel.randomize_va_space堆栈地址随机初始化,很好理解,就是在每次将程序加载到内存时,进程地址空间的堆栈起始地址都不一样,动态变化,导致猜测或找出地址来执行shellcode 变得非常困难。
编译代码第二行表示,gcc编译时,关闭DEP和栈保护。
当-f-stack-protector启用时(CANNARY栈保护),当其检测到缓冲区溢出时(例如,缓冲区溢出攻击)时会立即终止正在执行的程序,并提示其检测到缓冲区存在的溢出的问题。这是gcc编译器专门为防止缓冲区溢出而采取的保护措施,具体方法是gcc首先在缓冲区被写入之前在buf的结束地址之后返回地址之前放入随机的gs验证码,并在缓冲区写入操作结束时检验该值。通常缓冲区溢出会从低地址到高地址覆写内存,所以如果要覆写返回地址,则需要覆写该gs验证码。这样就可以通过比较写入前和写入后gs验证码的数据,判断是否产生溢出。
NX即No-execute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
工作原理如下图: