首页
社区
课程
招聘
[原创][原创]LordPE Bug修复
2017-7-7 16:31 10844

[原创][原创]LordPE Bug修复

2017-7-7 16:31
10844

       当你电脑上开启200多个进程的时候,再打开LordPE将会缓冲区溢出,导致程序崩溃!         

工作过程中经常使用LordPE 查看PE的信息,突然最近老是莫名其妙的崩溃,时崩时不崩的很难受,总是在关键的时候掉链子,决定分析一下;

1. 首先设置windbg捕获异常, 切到windbg目录执行 windbg.exe   -I;

2. 运行LordPE.exe  异常成功捕获到;

eip飞了,堆栈乱了, 无从下手呀!

好在还有ESP数据,看一下堆栈里面的调用

红框中的数据看着像同一类型的数据,难道是他们覆盖了堆栈?继续往下看

0018fb3c处涉及主模块了,看着像返回地址,IDA 中定位一下


从线程栈中可以看到,如果返回地址是004058af, 那说明004058ad调用SendMessageA还没有返回,返回地址就被覆盖了,下断点 跟一下



可以看到确实要调用User32!SendMessageA,系统函数应该不会崩溃呀,先验证一下

0:000> p

eax=00000000 ebx=74ce71fe ecx=00680a70 edx=00000030 esi=02c20512 edi=716c908c

eip=004058af esp=0018fb50 ebp=0018fbcc iopl=0         nv up ei pl zr na pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

image00400000+0x58af:

004058af e85c060000      call    image00400000+0x5f10 (00405f10)

0:000> dps esp

0018fb50  00000001

0018fb54  02c20512

0018fb58  00000001

0018fb5c  00000001

0018fb60  0000002c

0018fb64  00000004

0018fb68  00000000

0018fb6c  00000000

0018fb70  00000000

0018fb74  2c8319d5

0018fb78  00000000

0018fb7c  00000000

0018fb80  00000000

0018fb84  00000000

0018fb88  00000000

0018fb8c  00000017

0018fb90  04221050*** WARNING: Unable to verify checksum for F:\software\LPE-DLX\LDE\IntelliDump.LDE

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for F:\software\LPE-DLX\LDE\IntelliDump.LDE -

 IntelliDump+0x1050

0018fb94  00000006

0018fb98  00000000

0018fb9c  0000004c

0018fba0  0041be58 image00400000+0x1be58

0018fba4  00000000

0018fba8  00000000

0018fbac  00000000

0018fbb0  00000000

0018fbb4  0018fb50

0018fbb8  0018fbf0

0018fbbc  0018fc00

0018fbc0  004181f0 image00400000+0x181f0

0018fbc4  00419398 image00400000+0x19398

0018fbc8  ffffffff

0018fbcc  0018fc10

 

单步执行SendMessageA没有问题,堆栈也正常,再单步执行一下, 调用40fa10函数复现了异常,那问题确认了,就是这个函数内部有问题,内部看一下

在红框处下断点再跟一下,定位问题具体出现在哪里了;

0:000> bp 405f70

0:000> bp 405fa1

0:000> g

ModLoad: 74c60000 74cc0000   C:\Windows\SysWOW64\IMM32.DLL

ModLoad: 766c0000 7678d000   C:\Windows\syswow64\MSCTF.dll

ModLoad: 75d90000 75d95000   C:\Windows\syswow64\psapi.dll

ModLoad: 5bde0000 5bde6000   C:\Windows\SysWOW64\Riched32.dll

ModLoad: 67620000 67696000   C:\Windows\SysWOW64\RICHED20.dll

ModLoad: 6ec40000 6ecc0000   C:\Windows\SysWOW64\uxtheme.dll

ModLoad: 6d3b0000 6d3fc000   C:\Windows\SysWOW64\apphelp.dll

ModLoad: 00e80000 013a6000   C:\Windows\SysWOW64\SOGOUPY.IME

ModLoad: 6d440000 6d445000   C:\Windows\SysWOW64\MSIMG32.dll

ModLoad: 74c20000 74c55000   C:\Windows\syswow64\WS2_32.dll

ModLoad: 76930000 76936000   C:\Windows\syswow64\NSI.dll

ModLoad: 6d400000 6d43c000   C:\Windows\SysWOW64\OLEACC.dll

ModLoad: 70720000 70741000   C:\Windows\SysWOW64\ntmarta.dll

ModLoad: 74bb0000 74bf5000   C:\Windows\syswow64\WLDAP32.dll

ModLoad: 74750000 74759000   C:\Windows\SysWOW64\VERSION.dll

ModLoad: 6cfd0000 6cfe3000   C:\Windows\SysWOW64\dwmapi.dll

ModLoad: 6a720000 6a8b5000   D:\Program Files (x86)\SogouInput\Components\PicFace\1.0.0.1675\PicFace.dll

ModLoad: 74dc0000 74e51000   C:\Windows\syswow64\OLEAUT32.dll

ModLoad: 76790000 7679b000   C:\Windows\syswow64\profapi.dll

ModLoad: 06070000 0614d000   D:\Program Files (x86)\SogouInput\8.4.0.1062\Resource.dll

ModLoad: 04140000 04143000   F:\software\LPE-DLX\LDE\IntelliDump.LDE

Breakpoint 0 hit

eax=00690f80 ebx=00000000 ecx=006d0a70 edx=00000030 esi=74ce71fe edi=74cfa072

eip=00405f70 esp=0018f878 ebp=ffffffff iopl=0         nv up ei pl zr na pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246

image00400000+0x5f70:

00405f70 ffd7            call    edi {USER32!SendDlgItemMessageA (74cfa072)}

0:000> g

(3af4.1c74): Access violation - code c0000005 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

eax=000000a3 ebx=00000000 ecx=767e69ea edx=00250000 esi=74ce71fe edi=0018f8d0

eip=00003b40 esp=0018f88c ebp=ffffffff iopl=0         nv up ei pl nz ac pe nc

cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010216

00003b40 ??              ???

看来问题在 405f70 ~ 405fa1 区间内了;进一步跟踪最后确定问题出现在

看下此函数实现


竟然是procs.dll 导出的函数;

使用OD跟一下这个函数


2000120e直接跳转了,调用EnumProcess, 系统函数,看下声明

BOOL WINAPI EnumProcesses(

  _Out_ DWORD *pProcessIds,

  _In_  DWORD cb,

  _Out_ DWORD *pBytesReturned

);

要返回一串进程ID,联想到上面堆栈中的同一类型的数据,原来是进程ID;返回的进程ID把返回地址覆盖掉了

 

从函数头的 20001205处看到  SUB ESP,31C  栈空间31c大小;

2000129f处调用EnumProcess,第二个参数 缓冲区竟然 400大小, 有可能缓冲区溢出,

电脑上开的进程多了就崩,少了就不崩溃,我很少关机,看了下进程个数竟然小200个,这就是时不时的崩溃的原因吧!


既然发现问题了,修正吧,  把栈空间给他改大点, OD里面可以直接修改


涉及的都改了,然后保存修改到文件,运行ok,完美解决!

遗留问题:

上面说过“如果返回地址是004058af, 那说明004058ad调用SendMessageA还没有返回”,这个没有深究,要忙其他的了,

简单看了一下,继续根据ebp往上找可以定位到这是一个DlgDefProc函数里面调用的,IDA里面也看了一下LordPE的窗口过程,

内部确实有调用00405F10,应该是SendMessage发送消息,然后消息过程中调用了这个函数。


 

 



[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞1
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  CCkicker   +1.00 2017/07/12
最新回复 (7)
雪    币: 230
活跃值: (137)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
laiyier 2017-7-7 20:18
2
0
可以的,我用windbg调试源码都没你玩的这么6.可以留个联系方式交流下debug技巧吗
雪    币: 280
活跃值: (514)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sdzzb 2017-7-7 20:42
3
0
LordPE在win10系统就会崩溃,照LZ的方法修改后果然好了!膜拜大神!
雪    币: 459
活跃值: (652)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ssarg 2017-7-7 22:45
4
0
有图,有真相,顶一下。
雪    币: 32403
活跃值: (18855)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2017-7-11 18:42
5
0
上个月,Diken也碰到了这个问题,他将修复好的DLL和源码发我了,见附件。

上传的附件:
雪    币: 335
活跃值: (80)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
战舰少女R 1 2017-7-11 19:46
6
0

“如果返回地址是004058af,  那说明004058ad调用SendMessageA还没有返回” 
无法理解这句话。
004058af  ;sendmessage返回地址
00120b42  ;参数4
00001003  ;参数3
00000001  ;参数2
004058af  ;参数1被sendmessage之后的call的返回地址覆盖 
也就是说,sendmessage调用成功且下一个call sub_405410的返回地址已经入栈。
感觉LZ逻辑链的第一环就是错的...

雪    币: 464
活跃值: (650)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
安全裤 2017-7-13 14:28
7
0
战舰少女R “如果返回地址是004058af,  那说明004058ad调用SendMessageA还没有返回”  无法理解这句话。004058af &a ...
嗯,我当时也不敢肯定返回地址是004058af,SendMessage的调用栈被擦除了,第四个参数找不到。
也没有仔细去看00405F10的函数,只是简单的认为进入一个函数ebp肯定会先保存,在4058b4上下也没有看到类似ebp的数据,
又看了下这个函数,进入00405F10里面首先是开辟栈空间了,保留了上一个函数的调用环境;这样也就解释的通,当调用SendMessage后
不崩溃的问题了;
雪    币: 57
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bestyyb 2017-7-14 23:36
8
0
直接替换kanxue发的那个dll也可以解决这个问题吗?还是必须修改主程序呢?出来个大侠确认一下。
游客
登录 | 注册 方可回帖
返回