当你电脑上开启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直播授课