一.
canary
相当于一个标志
当修改程序时,会发现程序是否被修改。
注: 找到canary
偏移地址,填充打印出canary
的值
1.程序源码:
2.编译:
gcc -m32 -ggdb -z execstack -fstack-protector -no-pie -o pwnme Cannary.c
生成pwnme
程序3.查看偏移地址是否一直在变动:
ldd pwnme
注:关闭地址随机化
echo 0 > /proc/sys/kernel/randomize_va_space
4.运行
pwnme
OK!
二.调试
1. 图片.png
2.进入汇编窗口
layout asm
图片.png
3.输入
ni
执行下一条指令,回车快捷方式4.一直往下
xor %gs:0x14,%eax
异或进行比较
图片.png
三.
canary泄露
1.
canary
是一直变化的值,每运行一次就发生一次变化。eax
的值变,也就说明canary
的值也发生变化。比较如下图:
图片.png
实际情况,跟自己的eax
的值.2.所以说
canary
的值具有不可预测性但是,
eax
的值来源于gs:0x14
,而gs:0x14
存在于栈空间上,所以我们只要找到它栈空间上的位置,就可以泄露它的值。接下来我们就利用格式化字符串漏洞泄露Canary
3.格式化字符串漏洞在
printf
在下断点。
图片.png
4.运行 输入值
5.然后查看栈空间内容,esp =
0xffffcf80
,指向字符串起始位置 =0xffffcfec
图片.png
注:由此可知格式化字符串偏移为 =
(0xffffcfec - 0xffffcf80) / 4 = 27
网友评论