如何利用printf漏洞突破canary保护

举报
拈花倾城 发表于 2022/01/14 13:32:31 2022/01/14
【摘要】 如何利用printf漏洞突破canary保护

@TOC

使用的实例代码如下
在这里插入图片描述为了配合本次实例的教学,大家在编译时,不加pie保护,加cannary保护,整个的流程就是,分析程序之后,编写exp,利用printf漏洞(填充func函数,使其返回地址为exploit函数)来突破canary并且覆盖ret。

在这里插入图片描述
之后使用gdb开文件,查看func函数
在这里插入图片描述
来自英语白痴的小tip:
在这里插入图片描述

我们可以大概搞清楚func的流程,就是先read,然后printf,然后read,就是这样子。
我们下断就下到printf这里,我输入的测试用例是HHH

在这里插入图片描述我们回去看一下代码,输出的格式format我们没有给,所以默认的输出就是esp+4,现在我们来看一下栈吧,也就是0x28

在这里插入图片描述在这里插入图片描述
这里查看的canary的值,也就是0x619da200,我们在stack中找到他,然后计算一下canary和栈顶之间的偏移量是多少
在这里插入图片描述在这里插入图片描述

我们重新运行,并且用一下format格式,也就是我输入的%15$08x,上图还是断到了printf函数,我们n,看看输出了什么
在这里插入图片描述

然后我们查看一下stack 0x28,看看canary的值
在这里插入图片描述

也就是我们输出的那个值。
我们成功的将cannary的值输出了,那我们就可以写exp了

在这里插入图片描述上面就是exp了,现在我给大家讲一下exp为甚这样子写

首先导入pwn包,然后process()捕捉进程,然后计算canary的偏移,就是canary和输入的字符串的距离,第二个红框和第三个红框之间的距离,也就是8,所以canary_offset = 8*4(个字节)

在这里插入图片描述canary_offset * ‘a’ 就是把那8行填充为垃圾数据’a’

然后加上canary了,然后定义个变量,canary
首先要发送泄露的地址,也就是p.sendline(%15&08x) 这里就是我们一开始查看的那个,这个格式是一个string.format(),然后我们要接收这个泄露的地址,所以就是canary = recv(),然后打印出canary,是为了测试一下canary对不对,这个写不写无所谓的,后面的[:8],是因为记录了回车,也就是那个\n,但是我们不需要它,所以只要8位就可以了。

payload目前是:canary_offset * ‘a’ + canary

然后我们应该把ret的那段也填充了,所以创建一个变量ret_offset为什么是3*4,如下图
在这里插入图片描述

现在的payload是:canary_offset * ‘a’ + canary + ret_offset * ‘a’

然后我们要加上然后地址,我们要getshell,然后的地址应该是函数exploit(),我们在gdb中用dissass exploit来查看,如下图
在这里插入图片描述
设置新变量exploit_add = p32(0x08049192) p32 告诉电脑这是个32位地址

最后就是sendline,给第二个read(大家回头看看程序的代码)发送payload

最后一步获取运行时环境p.interactive()

还有比较重要的一点就是在我们接收到的canary是人眼看到的正序,但是呢程序是小端存储,所以我们要把canary变成倒叙传给程序,也就是canary = cannary.decode(“hex”)[::-1]

大功告成

我们运行一下exp,看下图:
在这里插入图片描述
在这里插入图片描述

getshell成功!!!!!!!!

希望大家可以有所收获!!!!!!!

exp写起来太恶心了,但是写完的时候是真的爽,pwn基础篇完结撒花,呱唧呱唧!!!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。