首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CTF中格式化字符串漏洞快速利用

格式化字符串是CTF比赛中很常见的一种pwn题,但是往往需要自己手工调试,如果可以快速利用该漏洞拿到一血,这无疑可以很大的鼓舞选手的信心,并且有丰厚的分值奖励。那怎么快速利用格式化字符串漏洞呢,甚至对漏洞原理不甚了解怎么快速利用呢,本文将慢慢揭晓。

首先介绍利用该漏洞的工具:https://github.com/hellman/libformatstr ,可以直接pip install libformatstr安装。格式化字符串漏洞的利用方式就是在任意地址写入任意数据,比如改写got表,下边分三种情况介绍:

直接输入所有输入信息

测试代码:

编译:gcc -Wno-format-security print_format.c -o print_format

利用思路可以直接将exit函数的got表修改为函数win的地址,这样调用exit时,函数win得到执行,获得shell。

首先计算偏移跟填充,这里举个例子:

比如用户输入aaaBBBB.%x.%x.%x.%x.%x.%x,

那么这里偏移是6,填充是3.

下边直接用libformatstr计算:

这样直接计算出偏移是6,填充是3

知道了偏移 填充,以及win函数地址,exit got表地址,可以直接利用:

说明: p.payload(6,3) 直接输入偏移,填充

p[exit_got] = win_addr 因为是直接将win函数地址写入exit函数的got表,所以可以直接这样写。

输出有预打印字符

测试代码:

编译:gcc -Wno-format-security print_format.c -o print_format

可以看到这次代码跟上次的不同就是输出时先输出”hello,”,再输出用户输入的数据。

首先计算偏移填充:

可以看到偏移填充是8 3

此处计算计算偏移填充时,因为会预输出”hello,”,所以代码中使用r.recv()[6:] 计算。

知道了偏移填充,就可以直接利用,注意此处的预输出数据的影响,所以此时payload是p.payload(8,3,start_len=6)

完整代码:

输入数据有限制

程序对用户输入的数据有限制,只能输入特定格式的数据

测试代码:

可以看到用户输入的数据必须以http://开头,首先计算偏移填充:

可以看到偏移是7,填充是1,注意此时先输入http://,在输入随机字符,计算偏移填充,收到的数据也要从第七个字符开始计算:

r.sendline(“http://”+make_pattern(bufsiz)) # send cyclic pattern to

data = r.recv()[7:]

知道了偏移填充,就可以直接利用,注意此处要先输入http:// , payload从第七位开始算(buf = p.payload(7,1,start_len=7) r.sendline(“http://”+buf)

),完整利用代码如下:

最后介绍一下任意内存读取,当为第一种情况时,首先获取偏移 填充

然后:

当遇到第二种情况时:

可以看到只是recv处理数据时,要将预打印字符长度算进去。

当为第三种情况时,

可以看到输入输出都要将限制字符计算进去。

参考资料:

https://github.com/hellman/libformatstr

https://blog.techorganic.com/2015/07/01/simplifying-format-string-exploitation-with-libformatstr/

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G0X6RW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券