首页
社区
课程
招聘
[原创]记一次内存泄露检查
发表于: 2021-5-9 14:36 8572

[原创]记一次内存泄露检查

2021-5-9 14:36
8572

一个服务器程序,基于Windows IOCP实现,一直稳定运行,近期加入了一个异步HTTP处理后(WinHttp), 出现了轻微的内存泄露情况。

首先为服务器程序配置PageHeap,重启服务,对程序做FullMemoryDump取样,间隔一定时间,拿到多个样本。

使用gflags做PageHeap配置,如下图:

我此处收集了3个dmp, 分别查看其堆内存使用情况:

其中堆036c0000的内存提交大小在1个小时内,由1884KB增加到2072KB,其它堆的提交内存未有明显变化,因此可以怀疑内存泄露是在堆036c0000发生的,下面进一步查看其分配详情:

可以看到,内存块1ac和26c大小的分配是比较可疑的,一直处于一个递增的状态,选择1ac的块,继续跟进分配详情:

似乎是在Rsa私钥解密时,申请的内存,再选几个地址看后,发现在Rsa公钥加密时也会有类似的调用栈,Rsa算法使用的是OpenSSL3.0库,在之前的版本已经稳定运行了多时,此次版本升级,似乎没有涉及到SSL相关的代码,不过已经大概确定了位置,就写测试代码详细调试跟进一下吧。


(调试使用的OpenSSL库是重新下载的最新版编译的,发现依然有泄露,同时泄露的内存块大小变成了0x1a4)

栈跟踪不是很完整,00ed467c下段跟一下,此函数调用比较频繁,可以分两次操作:

首先,下在函数返回地址处,把返回值记录下来,如:bp 00ed4691  "r rax; g;",选择一个新增的泄露的内存地址,看是第几次分配的内存,我本地第11次分配时的内存未释放,(需要注意的是!heap看到的内存UsrPtr是包含块头结构的,需要减去块头大小才是记录下来的返回值,在我本地,这个大小是0x20)

然后,下断bp 00ed4691 0n11 "r rax;", 创建新测试线程,断下后,查看堆栈如下:

进一步检查drbg_ctr_init,发现共有3个未释放指针,共占用(3 * 0x1a4)字节:

进一步回溯堆栈,发现了一处可疑操作:

跟进RAND_get0_public函数一探究竟:

同时,可以发现RAND_get0_private同RAND_get0_public,使用了同样的优化机制:


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

最后于 2021-5-10 15:47 被Anakin Stone编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (10)
雪    币: 8201
活跃值: (2706)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
敬仰中
2021-5-10 07:32
0
雪    币: 436
活跃值: (2668)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DLL_THREAD_DETACH中应该有对应的内存回收代码啊,难道没清理么?
2021-5-10 08:27
0
雪    币: 4230
活跃值: (3836)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
4
saloyun DLL_THREAD_DETACH中应该有对应的内存回收代码啊,难道没清理么?
使用的是静态库,动态库应该是不存在这个问题的。
2021-5-10 08:37
0
雪    币: 183
活跃值: (1223)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
赞一个。
有考虑过用vld来查吗,也应该能查出来。
2021-5-11 09:51
0
雪    币: 46
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
谢谢师傅分享
2021-5-12 00:03
0
雪    币: 4942
活跃值: (4663)
能力值: ( LV10,RANK:171 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2021-5-12 10:09
0
雪    币: 8188
活跃值: (2847)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
2021-5-12 10:25
0
雪    币: 164
活跃值: (1823)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
9
umdh.exe是不是更方便些
2021-5-13 10:59
0
雪    币: 4230
活跃值: (3836)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
10
MTRush umdh.exe是不是更方便些
各有优势吧,个人喜欢WinDBG多一点,有更宽广度和更细粒度的一个跟踪。
2021-5-13 11:42
0
雪    币: 164
活跃值: (1823)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
11
学习了
2021-5-13 15:52
0
游客
登录 | 注册 方可回帖
返回
//