zoukankan      html  css  js  c++  java
  • shellcode 反汇编,模拟运行以及调试方法

    onlinedisassembler

    https://onlinedisassembler.com 在线反汇编工具,类似于lda。功能比较单一。

    Any.run 等平台在线分析

    1. 将shellcode保存为文件
    2. 通过如下脚本,转换shellcode为char数组
    import binascii
    filename = "C:\Users\liang\Desktop\工作相关\样本\rdpscan\rdpscan\ssleay32.dll"
    #filename = "C:\Users\liang\Desktop\payload"
    
    shellcode = "{"
    ctr = 1
    maxlen = 15
    
    for b in open(filename, "rb").read():
        shellcode += "0x" + str(binascii.hexlify(b.to_bytes(length=1, byteorder='big')))[2:4] + ","
        if ctr == maxlen:
            shellcode += "
    "
            ctr = 0
        ctr += 1
    shellcode = shellcode[:-1] + "}"
    print(shellcode)
    
    1. 将结果复制到char shellcode处,并 通过如下vs程序加载shellcode
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    #pragma comment(linker, "/section:.data,RWE")  
    
    unsigned  char shellcode[] = 复制到这里
    
    typedef void(__stdcall* CODE) ();
    
    int main()
    {
    
    	PVOID p = NULL;
    	if ((p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL)
    		MessageBoxA(NULL, "申请内存失败", "提醒", MB_OK);
    	if (!(memcpy(p, shellcode, sizeof(shellcode))))
    		MessageBoxA(NULL, "写内存失败", "提醒", MB_OK);
    
    	CODE code = (CODE)p;
    
    	code();
    	return 0;
    }
    
    1. 设置c运行库的静态编译,如图设置,将运行库设置为多线程/MT
      ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [2].png)

    2. 点击生成解决方案,将生成的exe上传至Any.run去分析
      如图,即可通过在线分析平台去分析shellcode。简单快捷
      ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [3].png)

    槽点主要有如下几方面:

    1. 一定要选择静态编译c运行库,因为Any.run 的运行库可能会不全。以防万一
    2. shellcode不可以是xFF 这类形式,必须是0xFF。因为前者属于字符串,后者属于数组。待分析的shellcode较大,超过65535字节后,vs在编译时会报错 fatal error C1091: compiler limit: string exceeds 65535 bytes in length

    scdbg

    windows shellcode运行模拟器,模拟运行shellcode
    对于简单的shellcode 推荐使用此方法,模拟运行找到c2地址

    使用文章以及介绍

    https://isc.sans.edu/forums/diary/Analyzing+Encoded+Shellcode+with+scdbg/24134

    优点

    1. 支持debug shellcode
    2. dum内存
    3. 重定向tcp请求到其他机器,但是不支持urlopen等函数

    缺点:

    1. 功能较为单一,模拟运行不是很全。有时候可能执行不到某些流程。并且没有实现部分dll的导出函数

    图片
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [4].png)

    下载链接
    http://sandsprite.com/CodeStuff/scdbg.zip

    miasm

    miasm是一个python llvm写的逆向工程框架。

    但是官方中提供了很多例子,我们可以直接利用官方提供的脚本去完成很多任务

    miasm不仅仅支持pe文件,还支持elf等,支持x86,arm,mips等架构

    miasm功能不仅仅局限于这些,还有很多好玩的功能,例如自动化脱壳等。参考

    1. https://miasm.re/blog/index.html
    2. https://github.com/cea-sec/miasm/

    miasm 反编译shellcode

    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [6].png)

    使用graphviz 加载got文件,获得如下
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [5].png)

    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [7].png)

    同理 arm的选择arm,mips选择mips处理器类型

    如果不像使用官方自带,可以自己写

    沙箱中运行shellcode

    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [8].png)

    记录每步运行的各种寄存器的值

    沙箱中运行可执行系统文件

    在知道系统架构的情况下 可以选择相应系统架构的sandbox,运行shellcode,从而获得更多信息
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [9].png)

    可以支持自写dll,方便hook,如图,但是我没写
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [10].png)

    支持的系统架构如下
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [11].png)

    其他功能

    1. 添加断点
        # A breakpoint callback takes the jitter as first parameterdef dump(jitter):
            # Dump data ad address run_addr with a length of len(data)
            new_data = jitter.vm.get_mem(run_addr, len(data))
            # Save to disk
            open('/tmp/dump.bin', 'wb').write(new_data)
            # Stop execution
            return False
    
        # Register a callback to the breakpointmyjit.add_breakpoint(0x4000004b, dump)...myjit.cpu.EAX = 0x40000000myjit.init_run(run_addr)myjit.continue_run()
        
    
    1. hook沙箱中系统函数和peb等和数据结构
      例如hook urlmon_URLDownloadToCacheFileW
    
        def urlmon_URLDownloadToCacheFileW(jitter):
            ret_ad, args = jitter.func_args_stdcall(["lpunkcaller",
                                                     "szurl",
                                                     "szfilename",
                                                     "ccfilename",
                                                     "reserved",
                                                     "pbsc"])
            url = jitter.get_str_unic(args.szurl)
            print "URL:", url
            jitter.set_str_unic(args.szfilename, "toto")
            jitter.func_ret_stdcall(ret_ad, 0)
    

    注意 有时候程序调用沙箱没有实现的api,则需要通过上述该方法自己实现一个
    sandbox 默认只实现了以下几个dll的导出函数 ntdll.dll", "kernel32.dll", "user32.dll",
    "ole32.dll", "urlmon.dll",
    "ws2_32.dll", 'advapi32.dll', "psapi.dll"

    1. 读写并修改系统可执行文件
      例如pe文件的修改,添加.text区段,修改pe文件结构等。当然,也支持elf,mach-o文件的修改等
    import sys
    from elfesteem import pe_init
    
    # Get the shellcode
    data = open(sys.argv[1]).read()
    # Generate a PE
    pe = pe_init.PE(wsize=32)
    # Add a ".text" section containing the shellcode to the PE
    s_text = pe.SHList.add_section(name=".text", addr=0x1000, data=data)
    # Set the entrypoint to the shellcode's address
    pe.Opthdr.AddressOfEntryPoint = s_text.addr
    # Write the PE to "sc_pe.py"
    open('sc_pe.exe', 'w').write(str(pe))
    
    思维扩展
    1. sandbox加载一个pe文件
    2. 在pe文件中申请一段内存,存放shellcode
    3. 修改eip到shellcode处
    4. 运行

    好处,可以结合pe文件自动分析,分析处该shellcode的具体行为
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [12].png)

    OD加载shellcode

    方法一

    需要安装Olly Advanced 插件

    1. 随便load一个应用程序
    2. Alt+m 打开内存页面,添加内存,如图
      ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [13].png)
    3. 将shellcode复制进去
    4. 设置新的eip

    方法二

    该方法灵活应用
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [14].png)

    如图我们可以看出,加载shellcode的方式有以下几个步骤

    1. 调用virtualloc申请内存,属性为可写可执行。用来存放shellcode
    2. 调用createprocess 执行shellcode

    注意,并不是一定通过createprocess去执行shellcode。也可以通过内联汇编jmp,setThreadContext等方式去执行shellcode。理论上,只要可以修改eip,就可以执行shellcode

    od中输入命令 bp createprocess

    等运行shellcode的时候,od会自动停在createprocess处,也就是shellcode开始执行的位置。如图
    ![](https://potatso-1253210846.cos.ap-beijing.myqcloud.com//imgImage [15].png)

  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/potatsoSec/p/12323899.html
Copyright © 2011-2022 走看看