freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

格式化字符串绕过canary入门
2018-11-29 19:50:55
所属地 湖南省

原创: EDI-VOID 合天智汇 


格式化字符串漏洞是因为c语言中printf的参数个数不是确定的,参数的长度也不是确定的,当printf把我们的输入当作第一个参数直接输出的时候,我们输入若干格式化字符串,会增加与格式化字符串相对应的参数,会泄露出栈中的内容

Canary的工作原理就是子函数在做自己的事情之前,在自己的栈帧里返回地址之前插入一个随机的cookie,从gs:0x14的地方取出来,然后在函数返回之前对比栈中的这个随机值和gs:0x14来断定是否发生栈溢出,常用的对canary的绕过方法有通过格式化字符串泄露canary,劫持__stack_chk_fail,覆盖argv[0]等等,这里我们有格式化字符串漏洞,就直接用格式化字符串泄露出canary

思路


图片.png


图片.png

用ida简单看了一下逻辑,就是让你输入名字,然后调用get_message函数输出你的名字,然后让你留言,留言有溢出漏洞,显然用了printf,也有格式化字符串漏洞

检查一下程序开启的保护措施以及其他一些常规的东西


32位程序,只开启了Canary,所以我们可以用格式化字符串漏洞泄露出栈上保存的Canary
,没有开启NX,说明堆栈可执行,我们可以在第二次输入中直接把shellcode布置到栈里面

然后返回到栈里面

下面是get_message函数的反汇编代码

图片.png

chars到返回地址之前一共是0x70+4即116个字节即29个dword
不要问我为啥,我喜欢以四字节为单位
payload可以构造为如下形式

图片.png

这是第二步溢出的思路
在这之前我们要先通过格式化字符串漏洞泄漏出canary和我们shellcode的地址

这里计算canary相对于printf第一个参数的偏移的话,不用算,有技巧

先生成格式化字符串

图片.png

再附加调试器,在moveax,gs:0x14处下一句下断点,运行以后输入生成的格式化字符串
会断在下一句,这时候记下eax的值,然后输入c继续运行,复制输出的字符串


图片.png

图片.png

图片.png

mov   eax,gs:0x14
mov    DWORD PTR [ebp-0xc],eax


图片.png

0x2a8-0x218=0x90

exploit


图片.png

图片.png

题目放在了百度网盘,

链接:https://pan.baidu.com/s/1jDVh637xVIBvu8RhgB9Umw 

提取码:g7bx


# 合天智汇 # 合天网安
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者