这个控件会到http://%s.baidu.com:%d/%s 这样的一个地址下载程序安装运行,下载的文件文件会保存到本地缓存目录,而缓存文件的文件名是可以通过属性参数控制的,BaiduSetupAxPackageChannel这个属性指定缓存文件的名字。而属性参数是没有长度限制的,我们可以给PackageChannel赋值很长的串。
文件名属性参数 axBaiduSetupCtrl1.PackageChannel= AAAAAAAAAAAAAAAA.........这是一个长串
缓存文件路径 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\Baidu\BaiduSetupAx\\
HTTP缓存文件名的格式 HTTP{97500BA6-87CA-420C-8889-BFFA3868D8A4}_{axBaiduSetupCtrl1.PackageChanne}.exe
P2P 缓存文件名的格式 P2P{0FF9FDCD-76A9-4E5B-903E-7A35FC302F4B}{axBaiduSetupCtrl1.PackageChanne}.exe
最后会组成这样的缓存文件字符串
接下来会使用循环把缓存文件名拷贝到堆栈。
问题就在这里,它会把源串全部完全拷贝,而没有检查目标地址的大小。
所用当axBaiduSetupCtrl1.PackageChannel的值足够大时就会发生堆栈溢出
最后 GS Cookie检查抛出异常
__security_check_cookie((unsigned int)&v61 ^ v69);