[PWN][基础篇]保护函数和溢出实例
一、常见的保护
1、CANARY(栈保护)
栈溢出保护是一种缓冲区溢攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启动栈保护后,函数开始执行的时候会显往栈里插入cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如何不合法就停止程序运行。攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中的cookie信息成为canary。
2、NX(DEP)
NX是不可执行的意思,nx(dep)的原理就是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意代码
3、PIE(ASLR)
一般情况下NX和地址空间分布随机化(aslr)是会同时工作
内存地址随机化机制,有三种情况
0-表示关闭进程地址空间随机化
1-表示将mmap的机制,stack和vdso页面随机化
2-表示在1的基础上增加栈(heap)的随机化
可以防范基于Ret21bc方式的针对dep的攻击。aslr和dep配合使用,可以有效阻止攻击者在堆栈上运行恶意代码
二、神奇的小知识
1、如何检查文件的保护情况
checksec 文件名(要以root权限执行)
2、编译时如何关闭这些保护呢
gcc -no-pie -fno-stack-protector -Z execstack -m32 -o read read.c
3、查看程序使用了哪些函数
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权限了!
希望大家可以有所收获!!!