栈溢出保护是一种缓冲区溢攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启动栈保护后,函数开始执行的时候会显往栈里插入cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如何不合法就停止程序运行。攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中的cookie信息成为canary。
NX是不可执行的意思,nx(dep)的原理就是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意代码
一般情况下NX和地址空间分布随机化(aslr)是会同时工作 内存地址随机化机制,有三种情况 0-表示关闭进程地址空间随机化 1-表示将mmap的机制,stack和vdso页面随机化 2-表示在1的基础上增加栈(heap)的随机化 可以防范基于Ret21bc方式的针对dep的攻击。aslr和dep配合使用,可以有效阻止攻击者在堆栈上运行恶意代码
checksec 文件名(要以root权限执行)
gcc -no-pie -fno-stack-protector -Z execstack -m32 -o read read.c
objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具 -j hello 仅仅显示指定名称为hello的section的信息 -t 显示文件的符号表入口 objdump -t -j .text hello 查看hello程序的.text段有哪些函数
编译指令等请参照上一篇博客 我的上一篇文章
后续的操作如下:
这里我们分析一下,首先是sub esp,0x24,然后sub eso,0x4,所以在esp上方有0x28的空间,我们的目的是执行exploit的函数,所以我们就要覆盖到ret指令。
下面是我们的exp,我是用的是python来写
首先要导入pwn包,第二步我们要获得进程,也就是read程序了,再写偏移offset,也就是0x28+0x4, ,然后写payload,我们要覆盖,这里我用a来覆盖,offset次,再加上我们的返回地址,也就是在disass exploit中我们push ebp的地址,p32()是告诉电脑,这是个32位地址如下图:
字符a将0x28覆盖了,同时也覆盖了0x4(ebp),多出来的就将覆盖ret了,也就是上图中红框的地址。 然后我们写payload,使用sendline函数,发送内容是我们的payload。 最后我们获取一下运行环境,也就是p.interactive()
写好exp之后,可能没有权限,这个时候要提权,也就是chmod 777 exp.py,然后执行即可,结果如下图:
出现了$符号,说明我们已经获得了root权限了!
希望大家可以有所收获!!!