com 组件调用不起来_堆溢出和COM漏洞寻找

3a9c6679f152be96346d6bb978ee7591.png

本文为看雪论坛优秀文章

看雪论坛作者ID:自然dashen

堆溢出

>>>>

案例代码

#include "stdafx.h"#include #include #include #include struct tagNode
{char szName[8];struct tagNode *pNext;
};struct tagTest
{short Magic;short nLength;char *szBuf;
};void test(char *szPwd){
  tagNode *pHead = NULL;
  tagNode *pNode = NULL;
  FILE *fp = NULL;
  fp = fopen("name.txt", "r+");if (fp == NULL)
  {exit(-1);
  }int nRet = EOF;for (int i = 0; i < 3; i++)
  {
    pNode = new struct tagNode;
    nRet = fscanf(fp, "%s", pNode->szName);
    pNode->pNext = pHead;
    pHead = pNode;
  }for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
  {printf("%s\r\n", pNode->szName);
  }
  pNode = pHead;fscanf(fp, "%s", pNode->szName);
  pNode = pHead->pNext;fscanf(fp, "%s", pNode->szName);for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
  {printf("%s\r\n", pNode->szName);
  }if (fp)
  {
    fclose(fp);
    fp = NULL;
  }
}int main(int argc, char* argv[]){char szPwd[] = "Hello";
  test(szPwd);
  system("pause");return 0;
}

>>>>

先观察代码

可以得到一个类似结构的链表,如果在这里溢出修改pNext的话,因为fscanf结束后,还有pNode->pNext = pHead,会还原回去所以这里不行。

for (int i = 0; i < 3; i++)
{
  pNode = new struct tagNode;
  nRet = fscanf(fp, "%s", pNode->szName);
  pNode->pNext = pHead;
  pHead = pNode;
}

5874e34ab0f89cb8b640b83b75d6568d.png 这句代码的作用就是输入,没用写入的机会,所以也没用。

for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
{
  printf("%s\r\n", pNode->szName);
}

而这两句代码能够溢出数据,并且不会被写回,这里解释下为什么非要溢出改pNext,如果仅仅只是溢出数据,那么任何一个fscanf(fp, "%s", pNode->szName);这样的写法都能够随便溢出,但是我们缺少能够执行我们shellcode的机会。 第一个fscanf修改我们要第二次要写入数据的位置。 第二个fscanf。 会写入第二次数据,这次我们把数据写到哪里,能够有机会执行,又能够有写的权限?

pNode = pHead;
fscanf(fp, "%s", pNode->szName);
pNode = pHead->pNext;
fscanf(fp, "%s", pNode->szName);

继续看,下面调用了两个函数,printf,fclose 例如: printf里面会调用WriteFile和ReadFile等api。 fclose会调用CloseHandle等api,感兴趣的话可以OD自己跟进去看。 如果这些api通过IAT表调用的话,那么我们第二次写入的shellcode放入api在IAT表的地址,那么不就会执行到我们的shellcode吗?

for (pNode = pHead; pNode != NULL; pNode = pNode->pNext)
{
  printf("%s\r\n", pNode->szName);
}if (fp)
{
  fclose(fp);
  fp = NULL;
}

>>>>

进入printf函数查看间接调用的API

看到了WriteFile: a8e88474b09758dc08cd2c0e1980e6d3.png 也可以用访问断点来查看是否调用: 223eea34484331e666ad1a79e24194eb.png 发现有间接访问: e16660e06f85a76d7b9b00b80f4535c6.png 记录下:

00430250 >76C83ED3  kernel32.ReadFile

>>>>

编写读入的数据

fscanf遇到\x0D\x0A\x0C....会被截断: d76721b1335f274877865aec6148f55a.png 第一个循环构造的链表: 47f55eda8a5b51d0e820d58393ada453.png 接下来是我们定位的溢出位置的第一次执行,把ReadFileIAT地址给写进去: 8a530cf21dda5f4e581f63738e7d68d5.png crtl+g过去看发现是我们api地址: e045aa88369511ddfb61d2b36af98abb.png 写进去了但是崩溃了为什么呢? 因为call 这个地址跳过去一个不对的地址肯定崩。 6274a89dd07c6bd40be88fce4bca7c53.png 红框就是填写shllecode地址,正好是写入位置+4: b9bb7c7761247ec3fd3bc3745e7db1d6.png 在这个地址下硬件执行断点,发现可以来一切正常: 0f17bb6e70f561af9f32a9fd243b9ce8.png 寻找Com组件的漏洞

>>>>

寻找com漏洞工具

1. 查看所有的com组件 COM Explorer 2. 漏洞自动挖掘工具 COMRaider

>>>>

使用工具挖掘

点击statrt,然后点击Next: 0d9f31c440a85244607c6cbc2b6538d2.png 打开文件夹,选择要分析的com组件。 记得COM组件要注册: 49de114cb466acb572f544bc36380702.png 7591c927040c9648769958c7cff17e9e.png 生成脚本: 08761390137cbd2d4e6281f08cb3dda8.png 然后点击next, 再点击Fuzz, 跑完后就是这样的效果我们需要关注的就是这几个地方,有异常的就进去调试,判断是不是漏洞。 f9747cbb7231a46c576f6757a0b94480.png 点击view设置我们的调试器: 4b2ac8622f79339ac17e1da3d1819513.png 右键选择Olly启动: 5b6bb519c4e593fdc464c7444f2e35b6.png 会自动填写参数,启动OD: 5ba282bd3dfbd7aa60aab0b0ce341d6c.png 我们要知道我们是执行wscript这个exe调用脚本,然后调用COM组件: bd7a152b37b56e2b0958d57f73e1713f.png

>>>>

寻找COM组件的位置

2a01411f80b6ce785fc61150b72ad423.png 在这个函数里面下断点, 在DispCallFunc函数一直“步过”,直到见到Call reg时,我们就来到了进入COM某个函数边缘,F7进入。 f6e3c87da4443e32a5ea2b9ea193fa77.png 1a0bcaaa164d1e389fd4fa6b95bfc31c.png 进入之后观察栈有没有溢出的情况,会很明显的。 9099afd1f50c2bbf8514f9ad2e3eb6ca.png 当我走到这个call,栈变的一眼就看出来了,然后进去分析这个函数既可以了。 6746e3f16876ad729cf6a5d22a7a81a9.png 发现了溢出位置: f2a5915cad5ccc6a6f3f985ade7a2cfb.png 0a52c71d735509d6db514fb546712a1c.gif - End - a9e16936222861eb61bd3fb64f34f756.png

看雪ID:自然dashen

https://bbs.pediy.com/user-710414.htm 

*本文由看雪论坛  自然dashen  原创,转载请注明来自看雪社区

推荐文章++++

1a21391677613d482ae8e1204503d6be.png

* 应急服务辅助工具与系统溯源思路

* 利用auxv控制canary

* 未知黑客团队钓鱼样本分析

* 使用Binary Ninja去除ollvm流程平坦混淆

* 某盗链App逆向

好书推荐c95c75cdf127fdc7f23c11441a5922f1.png

﹀ ﹀ ﹀ 29bda6c54e5d78fe03385a86e1938f09.png 公众号ID:ikanxue 官方微博:看雪安全 商务合作:wsc@kanxue.com 27f0dceddf4bb9da084fa741f997b1b8.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值