首页
论坛
课程
招聘
[原创] windbg---powershell---sos-iex下断点获取执行脚本(找不到相关windows api的情况)
2020-11-19 10:58 595

[原创] windbg---powershell---sos-iex下断点获取执行脚本(找不到相关windows api的情况)

2020-11-19 10:58
595

0x0 前言

该方法适用于不知道恶意脚本会调用哪些关键的 api

 

sos 在此:
https://docs.microsoft.com/zh-cn/dotnet/framework/tools/sos-dll-sos-debugging-extension

0x1 操作过程

加载 sos:

1
.load sos

一开始不知道 怎么给 iex 下断,去 msdn 查一下相关信息:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-expression?view=powershell-7
了解到所在模块为 Microsoft.PowerShell.Utility

 

name2ee 可以获取一些方法、类的结构和地址

1
2
3
4
5
Usage: !Name2EE module_name item_name
  or    !Name2EE module_name!item_name
       use * for module_name to search all loaded modules
Examples: !Name2EE  mscorlib.dll System.String.ToString
          !Name2EE *!System.String

我们通过 name2ee 找一下具体的模块:

1
!name2ee * iex

应该就是这个 dll:

1
Module: 000007fef0711000 (Microsoft.PowerShell.Commands.Utility.dll)

在电脑搜索这个 dll,用 dnSpy 打开,定位到 Microsoft.PowerShell.Commands->InvokeExpressionCommand,里面有一个 ProcessRecord 方法,所以最终我们要下断的方法是:

1
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord

本来以为可以用 bpmd 命令直接下断,结果断不下来,所以还是用 name2ee 找到函数地址,以后就不用做上面的准备工作了,可以直接执行下面的命令:

1
!name2ee Microsoft.PowerShell.Commands.Utility.dll Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord

得到:

1
2
3
4
5
Module: 000007fef03e1000 (Microsoft.PowerShell.Commands.Utility.dll)
Token: 0x0000000006000476
MethodDesc: 000007fef03fd918
Name: Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord()
JITTED Code Address: 000007fef0548af0

JITTED Code Address 就是我们要下断的地址,下断:

1
bp 000007fef0548af0

断下来之后,怎么找到命令呢?
执行 !dso,找到所有的 Object,复制出来,搜索 Microsoft.PowerShell.Commands.InvokeExpressionCommand 得到:

1
2
3
RSP/REG          Object           Name
rbx              00000000032bfff8 Microsoft.PowerShell.Commands.InvokeExpressionCommand
000000001c48dbb0 00000000032bfff8 Microsoft.PowerShell.Commands.InvokeExpressionCommand

dump Object

1
!do 00000000032bfff8

得到:

1
2
3
4
5
6
7
8
9
Name: Microsoft.PowerShell.Commands.InvokeExpressionCommand
MethodTable: 000007fef079d758
EEClass: 000007fef0724998
Size: 128(0x80) bytes
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
...
000007feed1a7b08  4000252       70        System.String  0 instance 00000000032bb050 _command
...

继续dump _command 对应的 value

1
!do 00000000032bb050

得到:

1
2
3
...
String: &("{1}{0}" -f'al','s') ("{0}{1}" -f't','est')...
...

0x2 问题解决

  1. 1
    2
    Failed to find runtime DLL (mscorwks.dll), 0x80004005
    Extension commands need mscorwks.dll in order to have something to do.
    还没加载好,现在比较笨的办法就是 g 一下,立马 break,不行就再 g break 一下

0x3 总结

可能多次触发断点,每次断点可能还有多个 InvokeExpressionCommand Object,一般最后一次断点的第 1 个 InvokeExpressionCommand 对应的 _command value dump 出来的 string 是这种方法能做到的最好的效果

 

这种方法的优点是足够精确且通用,缺点就是略繁琐,如果能找到其他相关的 api 断点,就不需要用这种方法了

 

感谢yz


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回