采取双机调试的方法,被调试机使用Windows 7版本虚拟机,在硬件选项中添加串行端口,并命名为.pipecom_1,在I/O模式中勾选轮询时主动放弃。调试机使用Windows 10版本物理机,在桌面创建windbg(x86)版本快捷方式,并在属性的目标后添加-b -k com:pipe,port=.pipecom_1,resets=0。
kernel32!LoadLibraryW:
001b:765cf142 8bff mov edi,edi
接下来键入k查看栈回溯。 看到SHELL32!CShellLink::_LoadFromFile,猜测是从这个函数开始解析lnk文件的。使用lm v m shell32命令查看得到shell32.dll的在漏洞机中的路径: 然后就可以拿出来有漏洞的文件啦,我们接下来一边动态调试一边静态分析。 分步调试 首先在关键函数处下断点 bp SHELL32!CShellLink::_LoadFromStream
bp shell32!CShellLink::_LoadIDList
bp shell32!CShellLink::_DecodeSpecialFolder
bp shell32!TranslateAliasWithEvent
bp shell32!ReparseRelativeIDList
bp shell32!DisplayNameOfAsString
bp shell32!ReparseRelativeIDList+0xd5
bp shell32!CControlPanelFolder::_GetTemporaryAppIdForApplet
bp shell32!CControlPanelFolder::ParseDisplayName
bp shell32!CControlPanelFolder::_GetPidlFromAppletId
bp CControlPanelFolder::_GetAppletPathForTemporaryAppId
bp shell32!CPL_LoadCPLModule
首先是断到CShellLink::_LoadFromStream处,根据ida分析,我们可以知道它对lnk文件进行了一些必要的格式检查。 接下来断到CShellLink::_LoadIDList,是把ItemID[0]+ItemID[1]+ItemID[2]加载到this->0n188,我们执行到该函数结束(gu)查看this->0n188处可以看到加载的东西(db poi(ebx+0n188))。 接下来单步步过直到!CShellLink::_LoadFromStream+0x28读取extra_data数据,我们执行到此处查看this->0n228,可以看到将我们构造的extra_data数据加载进来(db poi(ebx+0n228))。 CShellLink::_DecodeSpecialFolder 解析SpecialFolderDataBlock,在过程中会使用A000000B和A0000005判断是否是specialfolder,我们可以查看一下 使用db poi(esi+0E4h)查看specialfolder 然后会用 Specialfolder ID 和 the offset 0x28在IDList找Item ID。 在SHCloneSpecialIDList中使用Specialfolder ID 0x03 d esp+8 l1 函数返回的是一个指向Control Panel的ITEMIDList结构的指针。 TranslateAliasWithEvent(根据0x28找id) 第一个参数是this->0n188处就是刚才加载的IDList,第二个参数是指向一块存放 ItemID[0]和ItemID[1]的内存。 在TranslateAliasWithEvent+0x86,然后调用ILFibChirld找到item[2]。 bp shell32!ReparseRelativeIDList db ecx 使用偏移量找到C:a.dll bp shell32!DisplayNameOfAsString db poi(esp+8),查看第二个参数 该函数使用SHBindToFolderIDListParent 给定以文件夹形式指定的Shell命名空间项目,以及相对于该文件夹的项目标识符列表,此函数绑定到命名空间项目的父项,并有选择地返回指向项目标识符列表的最终组件的指针。 bp shell32!CControlPanelFolder::_GetTemporaryAppIdForApplet 该函数把路径写进s_dsaTemporaryAppId。 一直返回到shell32!ReparseRelativeIDList+0xd5。完成对内存中前两项与恶意dll文件的绑定。 db poi(ebp-18) bp shell32!CControlPanelFolder::ParseDisplayName 该函数是调用动态对象的虚表函数来实现的,可以看出a.dll此时已经成为一个临时对象。 bp CControlPanelFolder::_GetAppletPathForTemporaryAppId获取dll str 使用临时对象获取dll str 执行完毕后 db esp-98c 接着以此为参数调用shell32!CPL_LoadCPLModule函数 完成恶意dll文件的加载 参考资料 https://bbs.pediy.com/thread-248701.htm
戳“阅读原文”查看更多内容
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论