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. 在onBackPress中实现退出拦截时不生效

    现象描述 在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress控制确认弹窗后自动退出不生效. 问题分析 快应用引擎实现机制决定了onbackpress不能有耗时的 ...

  2. Java实现解压缩文件和文件夹

    一 前言 项目开发中,总会遇到解压缩文件的时候.比如,用户下载多个文件时,服务端可以将多个文件压缩成一个文件(例如xx.zip或xx.rar).用户上传资料时,允许上传压缩文件,服务端进行解压读取每一 ...

  3. Beego框架学习---layout的使用

    Beego框架学习---layout的使用 在管理系统中,管理菜单的界面是固定的,会变化的只是中间的部分.我就在想,是不是跟angular的"组件模块的router-outlet一样&quo ...

  4. beego框架panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroller问题解决

    在使用beego框架时,出现类似于panic: 'GetSecurityInf' method doesn't exist in the controller CorporateInfcontroll ...

  5. 文本编辑工具 Vim与压缩打包

    vim一共有3种模式:一般模式.编辑模式和命令模式 一般模式下的移动光标 光标向左移动:h或者向左的方向键 光标向右移动:l或者向右的方向键光标向上移动:k或者向上的方向键光标向下移动:j或者向下的方 ...

  6. 2019第十届蓝桥杯省赛及国赛个人总结(java-B组)

    省赛: 今年省赛的题目比18年简单的多,基本都是暴力枚举.BFS之类.还记得去年在山师考蓝桥杯,我这种辣鸡连题目都没看懂.本以为蓝桥会变得越来越难,没想到今年就被打脸了.今年省赛后面三个编程大题一个没 ...

  7. 攻防世界 reverse easy_Maze

    easy_Maze 从题目可得知是简单的迷宫问题 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 ...

  8. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件

    在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...

  9. Git代码版本控制流程

    我们的项目使用Git作为代码仓库.和版本控制工具. Git有几种Workflow,来管理代码版本变更流程,我们采用Gitflow Workflow流程. Gitflow Workflow,采用了mas ...

  10. python中zip函数的使用

    zip(*iterables) zip可以将多个可迭代对象组合成一个迭代器对象,通过迭代取值,可以得到n个长度为m的元组.其中n为长度最短可迭代对象的元素个数,m为可迭代对象的个数.并且每个元组的第i ...