0x01 简介

  • VMware OVF Tool 是一个命令行实用程序,允许您从许多 VMware 产品导入和导出 OVF 包。在 2.1.0 - 2.1.3 之间的版本中存在格式化字符串漏洞,通过修改任意地址的任意数据,覆盖栈中的返回值,稍加利用就可以达到执行任意代码的目的

  • 调试环境:Windows 7 + VMware OVF Tool 2.1.0、调试工具:OD、样本:poc.ovf

  • 样本 poc + VMware OVF Tool 2.1.0 利用包下载(提取码:km7j)

0x02 OD 调试

  • 安装完 VMware OVF Tool 之后,命令行进入其目录,之后运行 poc.ovf 脚本发现如下报错信息,由于了解格式化字符串漏洞的原理,所以可以看出在打印出 AAAA… 字符之后将栈上的空间信息也打印了出来,应该是通过 %x 打印出来的

  • 由于格式化字符串漏洞的特殊性,所以在程序载入 OD 崩溃之后,可以选择使用智能搜索查找字符串 “Invalid value” 的方式来查找有漏洞的打印函数,这也是分析格式化字符串漏洞的通用方法

  • 这个就是马上要压入并且要打印出来的字符串,再往下有两个 std::basic_string 函数,这里可以推断出打印的函数是 C++ 的 std 负责打印,而不是使用 C 语言的 printf 打印。经资料显示 std::basic_string 的作用是分配一些字符串,而 std::basic_ostream 则负责将这些字符串打印出来

  • 由于知道了打印函数,所以直接在打印函数上下断点,待程序断在 “Invalid value” 处的时候,再激活断点运行,终于找到了在 std::basic_string 之后的 std::basic_ostream 打印函数

  • 接着一直 F8 往下执行,直到发生崩溃,这样就可以结合崩溃处和样本中的数据推算出格式化字符的位置(也可以结合 IDA 分析,不过那样太麻烦)

  • 经过几次尝试,发现到达此处的时候栈上的数据已经全部变为 ‘0’ 了,为什么会变为 ‘0’ 呢,因为 ebp 修改了 esp 的值,而 esp 是栈顶的指针;一般情况下 ebp 是不会被修改的,只有可能被格式化字符串给修改了

  • 下面需要找到 ebp 是何时被修改的,结果是在 ovftool.00417280 函数的结尾把栈上的数据 0x 00180345 pop 到 ebp 中,记下此时栈顶的位置是 0x0018FF18

  • 可以看到此时 ebp 的值为 0x00180345

  • 然后看一下 poc 样本中的数据,由于格式化字符非常明显,所以一眼就能看到;在经过了若干个 %08x 的打印栈上数据之后,最后用了一个 %hn 将栈上的数据覆盖为字符串的长度
  • 其中 %08x 的个数是 98 个,‘A’ 字符的个数是 26 个,%hn 之前的字符串长度为 (98 * 4 + 26) * 2 = 344 + 1 = 345,这里是宽字符打印

  • %08x 是 98 个,这个的意思就是经过 98 个 %08x 打印之后才会修改栈上的数据,也就是上面修改 esp 的值,刚刚修改 ebp 的时候栈顶为 0x0018FF18,而 98 个 %08x 打印的栈上数据的长度为 98 * 8 = 0x310,再拿 0x0018FF18 - 0x310 = 0x0018FC08
  • 再次运行到 “Invalid value” 字符串的位置查找栈地址 0x0018FC08,并且数据窗口跟随,往下寻找就会发现格式化字符的位置

  • 此时 0x0018FF18 地址的值也被修改了

  • 总结:CVE-2012-3569 巧妙的利用了格式化字符串漏洞,通过 98 个 %08x 定位栈地址,最后通过 %hn 将之前字符串的大小 0x345 覆盖栈地址值的高位,也就是刚刚的 0x0018FF18 的地址,做完了这些,那么被覆盖的值就会乖乖的弹出到 ebp 寄存器中,从而修改了 esp 的值…

0x03 利用

  • 由于这个格式化字符串的可以将任意数据覆盖任意栈地址,那么利用起来就和栈溢出利用是相似的,就是覆盖函数的返回地址,通过 ROP 避开 DEP,寻找没有被 ASLR 保护的模块避开 ASLR 等等,相比其他漏洞利用起来还是非常容易的

  • 参考资料:0day安全:软件漏洞分析技术 + 漏洞战争

CVE-2012-3569 的分析到此结束,如有错误,欢迎指正(天哪终于分析完了)

CVE-2012-3569:VMware OVF Tool 格式化字符串漏洞调试分析的更多相关文章

  1. Linux pwn入门教程(6)——格式化字符串漏洞

    作者:Tangerine@SAINTSEC 0x00 printf函数中的漏洞 printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进 ...

  2. Linux pwn入门教程——格式化字符串漏洞

    本文作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函 ...

  3. 格式化字符串漏洞利用实战之 0ctf-easyprintf

    前言 这是 0ctf 的一道比较简单的格式化串的题目. 正文 逻辑非常简单 do_read 可以打印内存地址的数据,可用来 泄露 got. leave 格式化字符串漏洞. printf(s) 直接调用 ...

  4. 格式化字符串漏洞利用实战之 njctf-decoder

    前言 格式化字符串漏洞也是一种比较常见的漏洞利用技术.ctf 中也经常出现. 本文以 njctf 线下赛的一道题为例进行实战. 题目链接:https://gitee.com/hac425/blog_d ...

  5. Linux下的格式化字符串漏洞利用姿势

    linux最早的漏洞防护机制nx-stack刚刚出现后就有人想出了突破方法.那就是只有栈是不可执行,而除了栈以外的其他地方还是可以执行的,只要把返回地址执行别的地方就可以. 一.格式化字符串漏洞 格式 ...

  6. 通过格式化字符串漏洞绕过canary

    1.1    canary内存保护机制 1.1.1    canary工作原理 canary保护机制类似于/GS保护机制,是Linux下gcc编译器的安全保护机制之一,在栈中的结构如下图所示: 在函数 ...

  7. [典型漏洞分享]YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

    YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述: YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口 ...

  8. 格式化字符串漏洞 format string exploit(一)

    本文系原创,转载请说明出处 本文为基于CTF WIKI的PWN学习 0x00 格式化字符串原理 先附一张经典的图,如下 其栈上布局如下: some value 3.14 123456 addr of ...

  9. CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

随机推荐

  1. [通达OA] RCE + Getshell

    跟着大佬轻松复现:https://github.com/jas502n/OA-tongda-RCE 通达OA下载:https://www.tongda2000.com/download/2019.ph ...

  2. Redis 高并发带来的一些问题

    前言 本文讲述Redis在遇到高并发时的一些问题.即遇到大量请求时需要思考的点,如缓存穿透 缓存击穿 缓存雪崩 热key处理.一般中小型传统软件企业,很难碰到这个问题.如果有大并发的项目,流量有几百万 ...

  3. FreeBSD 如何安装软件

    1:概括FreeBSD捆绑了丰富的系统工具集合作为基础系统的一部分.此外,FreeBSD提供了两种用于安装第三方软件的补充技术:FreeBSD Ports Collection,用于从源代码安装,以及 ...

  4. Spring Boot 轻量替代框架 Solon 的架构笔记 - new

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  5. 翻译:《实用的Python编程》05_00_Overview

    目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概 ...

  6. Codeforces 784B Santa Claus and Keyboard Check

    题面: 传送门 B. Santa Claus and Keyboard Check Input file: standard input Output file: standard output Time ...

  7. P1028_数的计算(JAVA语言)

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(0n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能 ...

  8. Logtash 配置文件解析-转载

    转载地址:https://dongbo0737.github.io/2017/06/13/logstash-config/ Logtash 配置文件解析 logstash 一个ELK架构中,专门用来进 ...

  9. SCIP:构造过程抽象--面向对象的解释

    心智的活动,除了尽力产生各种简单的认知之外,主要表现为如下三个方面:(1)将若干简单认知组合为一个复合的认识,由此产出各种复杂的认知.(2)将两个认知放在一起对照,不管他们如何简单或者复杂,在这样做时 ...

  10. oo第四单元暨课程总结

    第四单元架构设计总结 第一次作业 单独写了MyUmlClass.MyUmlInterface.MyUmlOperation三个类对应UML中相应元素,在UML图中这几个元素包含一些下级元素,如Clas ...