首页
社区
课程
招聘
[原创]Easy RM to MP3 Converterv2.7.3(CVE-2009-1330) 个人漏洞分析报告
发表于: 2017-2-27 16:10 10468

[原创]Easy RM to MP3 Converterv2.7.3(CVE-2009-1330) 个人漏洞分析报告

2017-2-27 16:10
10468

//------------------------------------------------------------

//

//    个人学习二进制漏洞挖掘时写的漏洞报告总结,算作是项目总结

//    研究的类型包括:缓冲区溢出、UAF漏洞、类型混淆

//    包括内容如下:

//    基本的漏洞成因

//    调试工具的使用

//    shellcode(弹框、bindshell)的编写以及改进

//    SEH常识

//    exploit的编写

//    堆喷射

//    ASLR/DEP的基本常识

//    ROP链的构造等

//

//    本来是发到MottoIn上的一些投稿,因为错过了时间,所以发到看雪上接收批评

//    最近在研究渗透以及安卓,驱动也没研究完。。。个人时间比较紧,有空再整理成单独的教程


这个漏洞是0day书上的标准缓冲区漏洞,PoC实现也非常简单,很多人也都研究过了,我简单的整理一下个人的思路,以及本文所涵盖的内容。

这篇包含了弹窗shellcode的编写以及exploit的实现,超出了一篇漏洞报告所涵盖的内容,写的时候没考虑太多,有空再整理。

很早之前写的东西,有些概念理解错误,之后更正。

可直接下载附件

---

以下正文:


Easy RM to MP3 Converterv2.7.3CVE-2009-1330

漏洞分析报告

 

软件名称Easy RM to MP3 Converter

软件版本2.7.3

漏洞模块RM2MP3Converter.exe

模块版本

编译日期2006-09-29

操作系统Windows XP/2003/7/8.1/10

漏洞编号CVE-2009-1330

危害等级:中危

漏洞类型:缓冲区溢出

威胁类型:本地

 

分析人:Red_0range

20161225

 

 

 

Easy RM to MP3 Converter05-06年流行的一款体积较小的轻量级音频转换软件。

支持常用音频格式文件MP3 WMA WAV OGG等之间的转换


软件界面

Easy RM to MP3 Converter(version 273700) 加载畸形过长的。m3u文件时触发缓冲区溢出

3.0. 概览

构造畸形过长,m3u文件,软件加载文件后跳转到指定代码,执行弹出对话框操作

(根据shellcode决定)


软件漏洞利用示例

3.1. 相关知识说明

3.1.1.     缓冲区溢出

缓冲区溢出可以分为堆溢出和栈溢出, 堆跟栈是两片不同架构的内存区域。

 堆:程序运行时动态申请而分配的空间,大小不固定,可动态扩展。特点是需要主动申请:例如c语言中的malloc函数,申请的内存添加到堆上,堆被扩大。 主动释放:例如free函数,假如不主动释放,就会造成内存泄漏。

栈: 栈在程序运行时自动产生,负责保存进程的运行上下文,当函数调用时,逻辑上会在栈中开辟一块新区域, 我们称之为栈帧(stack frame),栈帧内保存调用的参数、返回值,包括上一级函数的返回地址。例如:

void test(){

    …

}

main(){

    test();

    …

}

例如main函数中调用test函数,假如有参数 逻辑上新建的栈帧中会保存参数,并且会保存main函数的地址,test函数执行完成后用来返回到main函数,回到原先的栈帧。然后继续执行下面的代码。

逻辑上新开辟的栈帧已经消失,但物理保存的数据并不会消失, 栈的溢出原理就是参数的值超出了缓冲区的大小,覆盖了返回地址,函数调用完成后,返回到了攻击者指定的地址去执行代码。

简单的来说,如果我们输入的数据长度超过了开发人员定义的缓冲区,那么这个数据就可以覆盖掉EIPEIP是指令寄存器,它存放当前指令的下一条指令的地址。如果它被来自用户输入的垃圾数据覆盖了,程序通常会崩溃,因为它跳转到的地址并尝试指向,但执行的并不是有效的指令。


典型的内存布局


输入超过用户缓冲区


开发人员错误处理-输入覆盖缓冲区和EIP,导致它跳转到无效的内存地址,程序崩溃

3.1.2.     SEH

SHEwindows提供的异常处理机制之一

Windowsr3环境下应用异常处理流程为:
1
 交给调试器(进程必须被调试)
2
 执行VEH
3
 执行SEH
4
 TopLevelEH(进程被调试时不会被执行)
5
 交给调试器(上面的异常处理都说处理不了,就再次交给调试器)
6
 调用异常端口通知csrssexe


Windows异常处理流程

具体在程序中表示为,当程序发生异常崩溃时,系统会弹出对话框并调用调试器,其中EIP指向错误的返回地址,因此触发缓冲区异常操作的常用手段之一即为返回地址淹没。

用程序演示得到下图的结果:


x32dbg接管调试程序,可以看到程序的EIP被用户输入的数据淹没

 

3.1.3.      相关术语

Fuzz

模糊性检测,即构造一系列无规则的“坏”数据插入应用程序,判断程序是否出现异常,以发现潜在的bug

Shellcode

Shellcode是一填充数据,针对特定漏洞填充触发相应操作

Payload

Payload是指除了触发异常的数据之外汇编代码的机器码二进制数据

Exploit

出发漏洞并完成攻击的整体流程

POC

Proof of Concept概念证明,软件漏洞触发的原因和利用,以及个人shellcode编写

4.1. Fuzz

已知软件加载超过45kbm3u文件会触发异常。

构造>45kb相应的.m3u文件,并使用软件加载,观察触发异常的位置,并使用二分法逐渐缩减范围


不断缩小范围,最终确定程序在F111处触发

4.2. Shellcode编写

相应的攻击代码使用了vs2015的内联汇编,并用了release版进行编译。

Shellcode编写流程:

GetPC硬编码字符串

加载通用模块kernel32.dll/kernelbase.dll

在模块导出表获取LoadLibrary函数

在模块导出表获取GetProcAddress函数

加载user32.dll模块


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享! 在定位溢出点部分,可以使用Metasploit里面的pattern_create.rb工具,比二分法快些
2017-3-15 15:40
0
雪    币: 22
活跃值: (111)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
YP星星 感谢分享! 在定位溢出点部分,可以使用Metasploit里面的pattern_create.rb工具,比二分法快些
这篇是示范用的,一般我用mona,二分法哈哈挺古老
2017-3-22 14:22
0
雪    币: 1305
活跃值: (228)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
4
只想说,这个05年得,在哪里找得,曾经,找了半天,没找到地址
2017-5-23 11:34
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
793235968@qq.com      楼主给发一份  Easy  RM  to  MP3  Converterv2.7.3  谢啦!!!
2017-7-3 11:06
0
雪    币: 53
活跃值: (234)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
我也是用这个版本,但是我到缓冲区只能覆盖到返回地址后6个字节,见鬼了。。。
2017-7-26 20:24
0
雪    币: 2046
活跃值: (265)
能力值: ( LV7,RANK:104 )
在线值:
发帖
回帖
粉丝
7
楼主,那python写shellcode的原理是什么就是CTF中的PWN的那个,我很好奇,如何在程序不运行的情况下得到爆破点,然后进行PWN攻击的?程序不运行不是根本得不到栈基么?
2019-4-4 00:35
0
游客
登录 | 注册 方可回帖
返回
//