浅析shellcode 反汇编模拟运行及调试方法
onlinedisassembler
https://onlinedisassembler.com在线反汇编工具,类似于lda。功能比较单一。
Any.run等平台在线分析
- 将shellcode保存为文件
- 通过如下脚本,转换shellcode为char数组
importbinascii filename="C:\\Users\\liang\\Desktop\\工作相关\\样本\\rdpscan\\rdpscan\\ssleay32.dll" #filename="C:\\Users\\liang\\Desktop\\payload" shellcode="{" ctr=1 maxlen=15 forbinopen(filename,"rb").read(): shellcode+="0x"+str(binascii.hexlify(b.to_bytes(length=1,byteorder='big')))[2:4]+"," ifctr==maxlen: shellcode+="\n" ctr=0 ctr+=1 shellcode=shellcode[:-1]+"}" print(shellcode)
1,将结果复制到charshellcode处,并通过如下vs程序加载shellcod
#include#include #include #pragmacomment(linker,"/section:.data,RWE") unsignedcharshellcode[]=复制到这里 typedefvoid(__stdcall*CODE)(); intmain() { PVOIDp=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); CODEcode=(CODE)p; code(); return0; }
1.设置c运行库的静态编译,如图设置,将运行库设置为多线程/MT
点击生成解决方案,将生成的exe上传至Any.run去分析如图,即可通过在线分析平台去分析shellcode。简单快捷
槽点主要有如下几方面:
- 一定要选择静态编译c运行库,因为Any.run的运行库可能会不全。以防万一
- shellcode不可以是\xFF这类形式,必须是0xFF。因为前者属于字符串,后者属于数组。待分析的shellcode较大,超过65535字节后,vs在编译时会报错fatalerrorC1091:compilerlimit:stringexceeds65535bytesinlength
scdbg
windowsshellcode运行模拟器,模拟运行shellcode对于简单的shellcode推荐使用此方法,模拟运行找到c2地址
使用文章以及介绍
https://isc.sans.edu/forums/diary/Analyzing+Encoded+Shellcode+with+scdbg/24134
优点
- 支持debugshellcode
- dum内存
- 重定向tcp请求到其他机器,但是不支持urlopen等函数
缺点:
功能较为单一,模拟运行不是很全。有时候可能执行不到某些流程。并且没有实现部分dll的导出函数图片
下载链接
http://sandsprite.com/CodeStuff/scdbg.zip
miasm
miasm是一个pythonllvm写的逆向工程框架。
但是官方中提供了很多例子,我们可以直接利用官方提供的脚本去完成很多任务
miasm不仅仅支持pe文件,还支持elf等,支持x86,arm,mips等架构
miasm功能不仅仅局限于这些,还有很多好玩的功能,例如自动化脱壳等。参考
https://miasm.re/blog/index.htmlhttps://github.com/cea-sec/miasm/
miasm反编译shellcode
使用graphviz加载got文件,获得如下
同理arm的选择arm,mips选择mips处理器类型
如果不像使用官方自带,可以自己写
沙箱中运行shellcode
记录每步运行的各种寄存器的值
沙箱中运行可执行系统文件
在知道系统架构的情况下可以选择相应系统架构的sandbox,运行shellcode,从而获得更多信息
可以支持自写dll,方便hook,如图,但是我没写
支持的系统架构如下
其他功能
1.添加断点
#Abreakpointcallbacktakesthejitterasfirstparameterdefdump(jitter): #Dumpdataadaddressrun_addrwithalengthoflen(data) new_data=jitter.vm.get_mem(run_addr,len(data)) #Savetodisk open('/tmp/dump.bin','wb').write(new_data) #Stopexecution returnFalse #Registeracallbacktothebreakpointmyjit.add_breakpoint(0x4000004b,dump)...myjit.cpu.EAX=0x40000000myjit.init_run(run_addr)myjit.continue_run()
1.hook沙箱中系统函数和peb等和数据结构例如hookurlmon_URLDownloadToCacheFileW
defurlmon_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文件的修改等
importsys fromelfesteemimportpe_init #Gettheshellcode data=open(sys.argv[1]).read() #GenerateaPE pe=pe_init.PE(wsize=32) #Adda".text"sectioncontainingtheshellcodetothePE s_text=pe.SHList.add_section(name=".text",addr=0x1000,data=data) #Settheentrypointtotheshellcode'saddress pe.Opthdr.AddressOfEntryPoint=s_text.addr #WritethePEto"sc_pe.py" open('sc_pe.exe','w').write(str(pe))
思维扩展sandbox加载一个pe文件在pe文件中申请一段内存,存放shellcode修改eip到shellcode处运行
好处,可以结合pe文件自动分析,分析处该shellcode的具体行为
OD加载shellcode
方法一
需要安装OllyAdvanced插件
随便load一个应用程序Alt+m打开内存页面,添加内存,如图
方法二
该方法灵活应用
如图我们可以看出,加载shellcode的方式有以下几个步骤
调用virtualloc申请内存,属性为可写可执行。用来存放shellcode
调用createprocess执行shellcode
注意,并不是一定通过createprocess去执行shellcode。也可以通过内联汇编jmp,setThreadContext等方式去执行shellcode。理论上,只要可以修改eip,就可以执行shellcode
od中输入命令bpcreateprocess
等运行shellcode的时候,od会自动停在createprocess处,也就是shellcode开始执行的位置。如图
总结
以上所述是小编给大家介绍的浅析shellcode反汇编模拟运行及调试方法,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。