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. 如果一个网站存在CSRF漏洞,可以通过CSRF漏洞做下面那些事情?

    如果一个网站存在CSRF漏洞,可以通过CSRF漏洞做下面那些事情? 答:跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求.利用受害者在被攻击网站已经获取的注册凭证 ...

  2. 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现

    RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管 ...

  3. C语言经典88案例,我文科妹妹说她都学会了!

    案例ex01: 将字符串转换为一个整数 1 题目 函数:fun() 功能:将字符串转换为一个整数 描述: [不能使用C语言提供的字符串函数] 输入:字符串"-1234" 输出:整型 ...

  4. [Elementary Mechanics-01]Two masses and a spring

    [Elementary Mechanics Using Python-01] Question 5.28 Two masses and a spring. Two particles of m = 0 ...

  5. linux时间问题

    如果遇到创建时间和更新时间,不一致,先将时间调整为一致. 导致不一致的原因可能是时区不对,使用 tzselect ,将时区调整为Asia/Shanghai , cp /usr/share/zonein ...

  6. python面试题,print写在for循环内和外的区别

    1.统计列表中正数和负数的数量a = [1,3,5,7,0,-1,-9,-4,-5,8]b = []c = []for i in a : if i>0: b.append(i) elif i&l ...

  7. 最权威最简明的maven 使用教程

    Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Depen ...

  8. python inspect库

    一.介绍 inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等. inspect模块主要提供了四种用处: 对是否是模块.框架.函数进行 ...

  9. ssh 免登录配置

    引子 近日海淘了一个 mini-PC:Gigabyte GB-BSRE-1605,此设备虽采用 amd 嵌入式低功耗处理器,性能相比现在自己所用的设备却有不小提升,加上先前升级电脑多余一些 ssd 和 ...

  10. ElasticSearch实战系列十: ElasticSearch冷热分离架构

    前言 本文主要介绍ElasticSearch冷热分离架构以及实现. 冷热分离架构介绍 冷热分离是目前ES非常火的一个架构,它充分的利用的集群机器的优劣来实现资源的调度分配.ES集群的索引写入及查询速度 ...