//------------------------------------------------------------
//
// 个人学习二进制漏洞挖掘时写的漏洞报告总结,算作是项目总结
// 研究的类型包括:缓冲区溢出、UAF漏洞、类型混淆
// 包括内容如下:
// 基本的漏洞成因
// 调试工具的使用
// shellcode(弹框、bindshell)的编写以及改进
// SEH常识
// exploit的编写
// 堆喷射
// ASLR/DEP的基本常识
// ROP链的构造等
//
// 本来是发到MottoIn上的一些投稿,因为错过了时间,所以发到看雪上接收批评
// 最近在研究渗透以及安卓,驱动也没研究完。。。个人时间比较紧,有空再整理成单独的教程
这个漏洞是0day书上的标准缓冲区漏洞,PoC实现也非常简单,很多人也都研究过了,我简单的整理一下个人的思路,以及本文所涵盖的内容。
这篇包含了弹窗shellcode的编写以及exploit的实现,超出了一篇漏洞报告所涵盖的内容,写的时候没考虑太多,有空再整理。
很早之前写的东西,有些概念理解错误,之后更正。
可直接下载附件
---
以下正文:
Easy RM to MP3 Converterv2.7.3(CVE-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
2016年12月25日
Easy RM to MP3 Converter为05-06年流行的一款体积较小的轻量级音频转换软件。
支持常用音频格式文件MP3, WMA, WAV, OGG等之间的转换
软件界面
Easy RM to MP3 Converter(version 2。7。3。700) 加载畸形过长的。m3u文件时触发缓冲区溢出
3.0. 概览
构造畸形过长,m3u文件,软件加载文件后跳转到指定代码,执行弹出对话框操作
(根据shellcode决定)
软件漏洞利用示例
3.1. 相关知识说明
3.1.1. 缓冲区溢出
缓冲区溢出可以分为堆溢出和栈溢出, 堆跟栈是两片不同架构的内存区域。
堆:程序运行时动态申请而分配的空间,大小不固定,可动态扩展。特点是需要主动申请:例如c语言中的malloc函数,申请的内存添加到堆上,堆被扩大。 主动释放:例如free函数,假如不主动释放,就会造成内存泄漏。
栈: 栈在程序运行时自动产生,负责保存进程的运行上下文,当函数调用时,逻辑上会在栈中开辟一块新区域, 我们称之为栈帧(stack frame),栈帧内保存调用的参数、返回值,包括上一级函数的返回地址。例如:
void test(){
…
}
main(){
test();
…
}
例如main函数中调用test函数,假如有参数 逻辑上新建的栈帧中会保存参数,并且会保存main函数的地址,test函数执行完成后用来返回到main函数,回到原先的栈帧。然后继续执行下面的代码。
逻辑上新开辟的栈帧已经消失,但物理保存的数据并不会消失, 栈的溢出原理就是参数的值超出了缓冲区的大小,覆盖了返回地址,函数调用完成后,返回到了攻击者指定的地址去执行代码。
简单的来说,如果我们输入的数据长度超过了开发人员定义的缓冲区,那么这个数据就可以覆盖掉EIP,EIP是指令寄存器,它存放当前指令的下一条指令的地址。如果它被来自用户输入的垃圾数据覆盖了,程序通常会崩溃,因为它跳转到的地址并尝试指向,但执行的并不是有效的指令。
典型的内存布局
输入超过用户缓冲区
开发人员错误处理-输入覆盖缓冲区和EIP,导致它跳转到无效的内存地址,程序崩溃
3.1.2. SEH
SHE是windows提供的异常处理机制之一
Windows对r3环境下应用异常处理流程为:
1。 交给调试器(进程必须被调试)
2。 执行VEH
3。 执行SEH
4。 TopLevelEH(进程被调试时不会被执行)
5。 交给调试器(上面的异常处理都说处理不了,就再次交给调试器)
6。 调用异常端口通知csrss。exe
Windows异常处理流程
具体在程序中表示为,当程序发生异常崩溃时,系统会弹出对话框并调用调试器,其中EIP指向错误的返回地址,因此触发缓冲区异常操作的常用手段之一即为返回地址淹没。
用程序演示得到下图的结果:
用x32dbg接管调试程序,可以看到程序的EIP被用户输入的数据淹没
3.1.3. 相关术语
Fuzz
模糊性检测,即构造一系列无规则的“坏”数据插入应用程序,判断程序是否出现异常,以发现潜在的bug。
Shellcode
Shellcode是一填充数据,针对特定漏洞填充触发相应操作
Payload
Payload是指除了触发异常的数据之外汇编代码的机器码二进制数据
Exploit
出发漏洞并完成攻击的整体流程
POC
Proof of Concept概念证明,软件漏洞触发的原因和利用,以及个人shellcode编写
4.1. Fuzz
已知软件加载超过45kb的m3u文件会触发异常。
构造>45kb相应的.m3u文件,并使用软件加载,观察触发异常的位置,并使用二分法逐渐缩减范围
不断缩小范围,最终确定程序在F111处触发
4.2. Shellcode编写
相应的攻击代码使用了vs2015的内联汇编,并用了release版进行编译。
Shellcode编写流程:
GetPC硬编码字符串
加载通用模块kernel32.dll/kernelbase.dll
在模块导出表获取LoadLibrary函数
在模块导出表获取GetProcAddress函数
加载user32.dll模块
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)