Skip to content

Latest commit

 

History

History
228 lines (112 loc) · 5.21 KB

[3072]-2021-9-1-shellcode分析技巧.md

File metadata and controls

228 lines (112 loc) · 5.21 KB

shellcode分析技巧

原创 Pearce 3072

3072

微信号 gh_02e64d74f88d

功能介绍 威胁狩猎,漏洞挖掘


__

收录于话题 #样本分析 ,4个

概述

0x00

一般情况下shellcode会首先通过PEB定位到_ PEB_LDR_DATA (+0xC)结构,然后从该结构中取出一条链表,可以是 InLoadOrderModuleList (+0xC)可以是 InMemoryOrderModuleList (+0x14)可以是 InInitializationModuleList (+0x1c),之后通过遍历这条双向链表来解析 LDR DATA_ 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.   


  13.   v0 = hModule;

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

  15.   if ( Destination == 1 )

  16.   {

  17.     Destination += 2;

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

  19.     GetLastError();

  20.     if ( v1 )

  21.     {

  22.       v2 = LoadResource(v0, v1);

  23.       if ( v2 )

  24.       {

  25.         v3 = SizeofResource(v0, v1);

  26.         if ( v3 )

  27.         {

  28.           v4 = LockResource(v2);

  29.           if ( v4 )

  30.           {

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

  32.             v6 = v5;

  33.             if ( v5 )

  34.             {

  35.               memmove(v5, v4, v3);

  36.               ThreadId = 0;

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

  38.               WaitForSingleObject(v7, 0xFFFFFFFF);

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

  40.             }

  41.           }

  42.         }

  43.       }

  44.     }

  45.     ExitProcess(0);

  46.   }

  47.   return 1;

  48. }

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

然后解析PE文件

循环比较hash值

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

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

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

预览时标签不可点

收录于话题 #

个 __

上一篇 下一篇

阅读

分享 收藏

赞 在看

____已同步到看一看写下你的想法

前往“发现”-“看一看”浏览“朋友在看”

示意图

前往看一看

看一看入口已关闭

在“设置”-“通用”-“发现页管理”打开“看一看”入口

我知道了

__

已发送

取消 __

发送到看一看

发送

shellcode分析技巧

最多200字,当前共字

__

发送中

写下你的留言

微信扫一扫
关注该公众号

知道了

微信扫一扫
使用小程序


取消 允许


取消 允许

: , 。 视频 小程序 赞 ,轻点两下取消赞 在看 ,轻点两下取消在看