-
-
[旧帖] [原创]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
# 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
谁下载
谁下载
谁下载
看原图
赞赏
雪币:
留言: