首页
社区
课程
招聘
[旧帖] [原创]Photodex ProShow Producer 缓冲区溢出漏洞分析 0.00雪花
发表于: 2012-7-26 22:25 1489

[旧帖] [原创]Photodex ProShow Producer 缓冲区溢出漏洞分析 0.00雪花

2012-7-26 22:25
1489
# Exploit Title: Photodex ProShow Producer v5.0.3256 Local Buffer Overflow Vulnerability
# Version:  v5.0.3256
# Author:  Julien Ahrens
# Homepage:  http://www.inshell.net
# Software Link: http://www.photodex.com
# Tested on:  Windows XP SP3 Professional German
# Howto: Place file into appdir -> Launch
1.        将load文件拷贝到安装目录
2.        用ollydbg载入应用程序,对CreateFileA下条件断点,bp CreateFileA, [STRING [esp+4]]== "C:\\Program Files\\Photodex\\ProShow Producer\\load",F9运行程序,程序暂停。

3.        对ReadFile下断点,F9运行,执行到shellcode读操作。
4.        Ctrl+F9后,shellcode读入内存空间,找到有意义的代码处,下内存访问断点,如下图所示。F9执行,观察每次中断,看是否向栈中写数据。

5.        第一次断下,此处判断是否回车换行,可删除内存断点
10021EE1   /74 09           JE SHORT if.10021EEC
10021EE3   |3C 0D           CMP AL,0D
10021EE5   |74 05           JE SHORT if.10021EEC
10021EE7   |46              INC ESI
10021EE8   |3BF1            CMP ESI,ECX
10021EEA  ^|7C F0           JL SHORT if.10021EDC
10021EEC   \8BFE            MOV EDI,ESI
鼠标选中10021EEC,按F4跳过,重新设置内存写入断点。F9执行,程序暂停到如下位置,

6.        中断位置102163处指令循环向栈中写数据,可以看到栈中数据已被覆盖,覆盖位置超出了栈的地址范围,产生异常,此时溢出已经发生。
总结分析:
        Shellcode 未执行成功,有兴趣的可以继续分析。
        溢出产生的原因是10021F03处调用memcpy未对目标缓冲区及写入size大小进行正确的校验,导致缓冲区溢出,覆盖返回地址。
        10021F03处反编译代码如下(只截取我们关心的位置):
v13 = OpenFile(FileName, &ReOpenBuff, 0x40u); //打开load文件
  v14 = v13;
  if ( v13 != -1 )   //判断文件是否打开成功
  {
    v15 = llseek(v13, 0, 2);  //将读写位置移动到文件尾部
    v16 = v15;
    v32 = v15;
    llseek(v14, 0, 0);
    v17 = (void *)NewMemoryCheckMemAllocLocal(v16, (int)"LoadPlug", (int)"if.c", 4094);
    v18 = v17;
    v33 = v17;
    if ( v17 )
    {
      if ( hread(v14, v17, v16) == v16 )   //将文件内容读入内存
      {
        lclose(v14);
        v19 = v32;
        for ( i = 0; i < v19; ++i )
        {
                //for循环用于判断是否碰到回车换行
          for ( j = i; j < v19; ++j )
          {
            v22 = *((_BYTE *)v18 + j);
            if ( v22 == 0xA )
              break;
            if ( v22 == 0xD )
              break;
          }
                //对构造文件来说,执行到此处j为文件大小,i为0
          if ( j != i )
          {
            memcpy(&Dst, (char *)v33 + i, j - i);

从上面可以看出,若文件足够大(Dst为局部变量,最大为290h),可造成Dst溢出。
有什么错误的地方还请指出
分析.doc

poc.rar

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//