缓冲区溢出-printf格式化输出漏洞-创新互联

0x01基础知识:

创新互联公司长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为望江企业提供专业的成都网站设计、网站制作,望江网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

在c语言中printf的使用方法为printf(format,<参量表>),printf是c语言中少见的可变参数的库函数,printf在调用前无法知道传入的参数到底有多少个(在32位汇编中参数都是压入栈中,也就是说printf不知到有多少个参数入栈了),例如printf("My name is %s,%s"),这里format指定了要传递2个参数,但我们并没有传,这时候printf就会去栈中高地址四字节数据来填充%s,也就是:format+4,format+8的值进行填充。

下面举个例子:

缓冲区溢出-printf格式化输出漏洞

编译:gcc -m32 -O0 base.c -o ./base 编译为32位。

这是我们的测试代码,在printf里没有给printf传递%s对应的值,我们一起来看下执行效果:

缓冲区溢出-printf格式化输出漏洞

你会发现,我们没有传递str变量,但还是打印了,我们使用GDB来调试下,看是否和我们前面说的使用format+4地址来填充.

汇编代码执行到printf的时候我们暂停,看看栈中的数据:

缓冲区溢出-printf格式化输出漏洞

format数据是0x8048580,对应在栈空间的位置:0xffffd5c0,按照之前的计算format+4对应的值为Margin,这样我们便验证成功了。

利用这个思路,我们可以考虑下,既然可以使用%s来打印栈空间的内容,那是不是所有栈空间的内容都可以打印,我使用%s时打印的是format+4,那我使用两个%s%s打印的是不是format+4,format+8的内容,以此类推我们可以将栈空间所有值都可以打印出来。接下来我们用一个实验来验证下我们的想法。

下面我们要做的是使用printf的格式化漏洞来泄漏canary的值来达到绕过的目的。

第一步:我们先分析下c语言代码

缓冲区溢出-printf格式化输出漏洞

代码中的func函数是有一个printf函数,存在格式化字符串漏洞,正常写法应该是printf("My name is %s",name)。

编译:gcc -fstack-protector -m32 -o0 c.c -o ./c

第二步:确认canary的位置(偏移量)

思路是:先找到我们输入内容的位置x,在找到canary位置y,然后x-y得到偏移量

在printf位置打断点:b printf

在gdb里执行r运行程序,然后输入aaaa(这里随意写,写aaaa的意义在于在栈空间里好找,都是61616161)

1.打印ebp的值,在函数运行时要保存ebp的值,所以,我们只要在函数运行的时候找到即可。执行命令disass func查看func函数汇编代码,在0x080484ea的位置打断点,因为gs:0x14的值就是Canary的值。

缓冲区溢出-printf格式化输出漏洞

打断点:b *0x080484ea,执行到此处,在输入两次n,执行完mov dword ptr [ebp-0xc],eax后canary的值就在eax中了

缓冲区溢出-printf格式化输出漏洞

可以看到canary的值为0xb26f7f00

我们在打断点b printf,然后执行c,执行到该断点(中间我们输入margin)

1.找到canary在栈中的位置:p $ebp (因为canary在ebp附近)

缓冲区溢出-printf格式化输出漏洞

在栈中找到ebp的位置,执行:stack 0x28(意思是要看四十行栈数据)

我们知道在栈帧空间中布局如下:

缓冲区溢出-printf格式化输出漏洞

可以看到canary在0xffffd5ec的位置,我们输入的margin字符串在0xffffd5b0位置,但是指向的是0xffffd5cc,所以我们可以计算我们输入的margin字符串距离canary:0xffffd5ec - 0xffffd5cc = 32,所以,我们如果要覆盖canary需要32个字符。

第三部:动态获取canary

现在我们知道了canary的偏移量,但是我们还不知道canary的动态值,这里我们就需要用到printf函数的格式化漏洞(回忆下前面讲的format+4),上面截图我们可以看到printf第一个参数距离canary有15所以我们可以输入%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x来得到canary的值(最后8位是canary),或者简化写法%15$08x.

第四步:获取shell

在程序中我们已经知道了有一个exploit函数可以让我们直接获取shell,所以我们就把func函数的返回地址直接覆盖为exploit即可

从上面步骤截图中我们可以看到canary到ebp是12,所以payload为:

'a' * 32 + canary + 'a' * 12 + exploit地址

python代码为:

缓冲区溢出-printf格式化输出漏洞

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网站栏目:缓冲区溢出-printf格式化输出漏洞-创新互联
网页路径:https://www.cdcxhl.com/article42/cedihc.html

成都网站建设公司_创新互联,为您提供品牌网站设计外贸建站软件开发商城网站服务器托管电子商务

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设