WinDBG 挂起 Shellcode 执行

逆向工程 艾达 调试 风袋 外壳代码 元破解
2021-06-30 23:12:52

我一直在尝试使用Windbg. 为了回顾我采取的步骤,我为 shellcode 分配了一个缓冲区,.foreach /pS 5 ( register { .dvalloc 400 } ) { r @$t0 = register }并将地址保存在伪寄存器中$t0后来我用eb @$t0 FC 48 83 E4...[REDACTED]. 然后rip通过执行更改为指向 shellcode 缓冲区的起始地址,r @$ip=@$t0然后简单地使用g.

问题是 shellcodewininet!HttpSendRequestA每次都挂在API 调用上。

手动中断执行后的堆栈跟踪:

00 000000e0f0efea28 00007ffc24811e93 ntdll!NtWaitForSingleObject+0x14
01 000000e0f0efea30 00007ffc11ba4f64 KERNELBASE!WaitForSingleObjectEx+0x93
02 000000e0f0efead0 00007ffc11b9fba7 wininet!CPendingSyncCall::HandlePendingSync_AppHangIsAppBugForCallingWinInetSyncOnUIThread+0xe0
03 000000e0f0efeb00 00007ffc11b47af6 wininet!INTERNET_HANDLE_OBJECT::HandlePendingSync+0x33
04 000000e0f0efeb30 00007ffc11b023a5 wininet!HttpWrapSendRequest+0x9a256
05 000000e0f0efecd0 00007ffc11b02318 wininet!InternalHttpSendRequestA+0x5d
06 000000e0f0efed40 000002a7d873018c wininet!HttpSendRequestA+0x58
07 000000e0f0efede0 000002a7d87301f9 0x000002a7d873018c
08 000000e0f0efede8 000002a7d873000a 0x000002a7d87301f9
09 000000e0f0efedf0 0000000000cc000c 0x000002a7d873000a

注意:奇怪的部分是,每当我在 windbg 插件中调试 shellcode 时,它​​实际上都能正常工作IDA PRO 7.5(我在插件控制台中所做的一切都与在 windbg 二进制控制台中所做的完全相同)。

至于shellcode,它是一个简单的现成的cobaltstrike http信标(任何类型的reverse shellshellcode都会发生同样的错误)。

在此处输入图片说明

InMemoryOrderModuleList遍历结构PEB,从散列解析 api 名称并简单地按顺序执行它们。

我以前从未在windbg 中直接调试过cobaltstrike 信标。

注意:当我尝试以相同的方式调试一个简单的 x64 计算器 shellcode 时,我没有遇到任何挂起或错误

1个回答

你能澄清一下你得到的错误是否与说这可能是由另一个持有 LoaderLock 的线程引起的消息有关吗?

如果是这种情况,则意味着您在 Windbg/cdb 在系统断点中断后分配内存等

如果您在系统断点上执行 .dvalloc,则 HttpRequestA 可能会导致阻塞

使用 g @$exentry 转到你的虚拟入口点,然后执行 shellcode

在 HttpSendRequestA 上点击 g 之前,使用 dp @rsp 查找返回地址并使用 bp poi(@rsp) 在返回上设置断点

它应该正确断裂而不是挂起

0:000> ? poi(@rsp)
Evaluate expression: 140696425381209 = 00007ff6`7074bd59
0:000> bp poi(@rsp)
0:000> bl
 0 e 00007ff6`7074bcb4     0001 (0001)  0:**** cdb+0xbcb4
 1 e 00007ff6`7074bd59     0001 (0001)  0:**** cdb+0xbd59
0:000> r rcx,rdx,r8,r9
rcx=0000000000cc000c rdx=00007ff67074bdc6 r8=ffffffffffffffff r9=0000000000000000
0:000> da @rdx
00007ff6`7074bdc6  "User-Agent: Mozilla/4.0 (compati"
00007ff6`7074bde6  "ble; MSIE 8.0; Windows NT 5.1; T"
00007ff6`7074be06  "rident/4.0; GTB7.4; InfoPath.2)."
00007ff6`7074be26  "."
0:000> g
ModLoad: 00007ffa`96760000 00007ffa`96776000   C:\Windows\SYSTEM32\dhcpcsvc6.DLL
ModLoad: 00007ffa`96c20000 00007ffa`96c3c000   C:\Windows\SYSTEM32\dhcpcsvc.DLL
ModLoad: 00007ffa`939a0000 00007ffa`93b76000   C:\Windows\SYSTEM32\urlmon.dll
ModLoad: 00007ffa`9c800000 00007ffa`9c80c000   C:\Windows\SYSTEM32\CRYPTBASE.DLL
Breakpoint 1 hit
cdb+0xbd59:
00007ff6`7074bd59 85c0            test    eax,eax
0:000> u .
cdb+0xbd59:
00007ff6`7074bd59 85c0            test    eax,eax
00007ff6`7074bd5b 0f859d010000    jne     cdb+0xbefe (00007ff6`7074befe)
00007ff6`7074bd61 48ffcf          dec     rdi
00007ff6`7074bd64 0f848c010000    je      cdb+0xbef6 (00007ff6`7074bef6)
00007ff6`7074bd6a ebd3            jmp     cdb+0xbd3f (00007ff6`7074bd3f)
00007ff6`7074bd6c e9e4010000      jmp     cdb+0xbf55 (00007ff6`7074bf55)
00007ff6`7074bd71 e8a2ffffff      call    cdb+0xbd18 (00007ff6`7074bd18)
00007ff6`7074bd76 2f              ???
0:000>

顺便说一句,当您在用户代码中时不需要 .dvalloc 只需使用 .readmem

0:000> .readmem cobabyte.bin 。l?377

读取 377 个字节。

0:000> u .
cdb+0xbbf0:
00007ff6`7074bbf0 fc              cld
00007ff6`7074bbf1 4883e4f0        and     rsp,0FFFFFFFFFFFFFFF0h
00007ff6`7074bbf5 e8c8000000      call    cdb+0xbcc2 (00007ff6`7074bcc2)
00007ff6`7074bbfa 4151            push    r9
00007ff6`7074bbfc 4150            push    r8
00007ff6`7074bbfe 52              push    rdx
00007ff6`7074bbff 51              push    rcx
00007ff6`7074bc00 56              push    rsi
0:000> u