如何把shellcode转换成exe文件分析

简介:

【转】http://www.freebuf.com/articles/web/152879.html


前言

在分析shellcode时,静态分析或者使用scdbg模拟分析都不够准确,如果转换成exe文件那么就可以用debugger或者IDA分析,会方便很多。

样本分析

这里以CVE-2013-3346
的样本为例,使用peepdf分析样本:

$ python peepdf.py -i -f ~/Downloads/sample.pdf                                                                                                                                                
File: sample.pdfMD5: 6776bda19a3a8ed4c2870c34279dbaa9SHA1: ad6a3564e125683a791ee98c5d1e66e1d9c6877dSize: 177511 bytesVersion: 1.1Binary: FalseLinearized: FalseEncrypted: FalseUpdates: 0Objects: 4Streams: 2Comments: 0Errors: 1Version 0:Catalog: 1Info: No

Objects (4): [1, 2, 3, 10]

Errors (1): [3]

Streams (2): [10, 3]

Encoded (0): []

Objects with JS code (1): [3]

Suspicious elements:

/AcroForm: [1]

/OpenAction: [1]

/XFA: [1]

/JS: [2]

/JavaScript: [2]

其中Objects with JS code (1): [3]可知对象3是一段js代码:

PPDF> object 3<< >>streamif(app.media.getPlayers().length >= 1) Q=~[];Q={___:++Q,$$$$:(![]+"")[Q],__$:++Q,$_$_:(![]+"")[Q],_$_:++Q,$_$$:({}+"")[Q],$$_$:(Q[Q]+"")[Q],_$$:++Q,$$$_:(!""+"")[Q],$__:++Q,$_$:++Q,$$__:({}+"")[Q],$$_:++Q,$$$:++Q,$___:++Q,$__$:++Q};Q.$_=(Q.$_=Q+"")[Q.$_$]+(Q._$=Q.$_[Q.__$])+(Q.$$=(Q.$+"")[Q.__$])+((!Q)+"")[Q._$$]+(Q.__=Q.$_[Q.$$_])+(Q.$=(!""+"")[Q.__$])+(Q._=(!""+"")[Q._$_])+Q.$_[Q.$_$]+Q.__+Q._$+Q.$;Q.$$=Q.$+(!""+"")[Q._$$]+Q.__+Q._+Q.$+Q.$$;Q.$=(Q.___)[Q.$_][Q.$_];Q.$(Q.$(Q.$$+"\""+"\\"+Q.__$+Q.$$_+Q.$$_+Q.$_$_+"\\"+Q.__$+Q.$$_+Q._$_+"\\"+Q.$__+Q.___+"\\"+Q.__$+Q.$$_+Q._$$+"\\"+Q.__$+Q.$_$+Q.___+Q.$$$_+(![]+"")[Q._$_]+(![]+"")[Q._$_]+Q.$$__+Q._$+Q.$$_$+Q.$$$_+"\\"+Q.$__+Q.___+"=\\"+Q.$__+Q.___+Q._+"\\"+Q.__$+Q.$_$+Q.$$_+Q.$$$_+"\\"+Q.__$+Q.$$_+Q._$$+Q.$$__+Q.$_$_+"\\"+Q.__$+Q.$$_+Q.___+Q.$$$_+"(\\\"%"+Q._+Q.___+Q.

...

这里要把从Q=~[]开始的加密代码拷贝到文件中。

这里的代码是用jjencode加密过的,使用peepdf自带的解密工具可以还原出js代码:

PPDF> js_jjdecode file /Users/seviezhou/Downloads/sample.js $> jsdecode

PPDF> js_analyse variable jsdecode $> shellcode

PPDF> show jsdecode

var shellcode = unescape("%u\00E8%u\0000%u\5D00%u\ED83%u\E905%u\008B%u\0000%u\5052%u\D231%u\C031%u\F980%u\7501%u\6604%u\EBAD%u\AC01%u\003C%u\0D74%u\613C%u\0272%u\202C%u\CAC1%u\010D%u\EBC2%u\39E3%u...

var executable = "";

var rop9 = "";

rop9 += unescape("%u\313d%u\4a82");

rop9 += unescape("%u\a713%u\4a82");

rop9 += unescape("%u\1f90%u\4a80");

...

...

PPDF> show shellcode

e8 00 00 00 00 5d 83 ed 05 e9 8b 00 00 00 52 50   |.....]........RP|

31 d2 31 c0 80 f9 01 75 04 66 ad eb 01 ac 3c 00   |1.1....u.f....<.|

74 0d 3c 61 72 02 2c 20 c1 ca 0d 01 c2 eb e3 39   |t.

js代码主要是shellcode的布置和堆喷射还有rop的构造,这里的shellcode利用CVE-2013-5065绕过了沙箱。将shellcode提取出来使用scdbg分析得到如下结果:

...401215  SetFilePointer(hFile=1a4, dist=0, 0, FILE_BEGIN) = 0401221  GetFileSize(1a4, 0) = ffffffff401215  SetFilePointer(hFile=1a8, dist=0, 0, FILE_BEGIN) = 0401221  GetFileSize(1a8, 0) = ffffffff401215  SetFilePointer(hFile=1ac, dist=0, 0, FILE_BEGIN) = 0401221  GetFileSize(1ac, 0) = ffffffff401215  SetFilePointer(hFile=1b0, dist=0, 0, FILE_BEGIN) = 0401221  GetFileSize(1b0, 0) = ffffffff401215  SetFilePointer(hFile=1b4, dist=0, 0, FILE_BEGIN) = 0401221  GetFileSize(1b4, 0) = ffffffff401221   83F8FF                          cmp eax,0xffffffff              step: 1647274  foffset: 221eax=ffffffff  ecx=0         edx=12fdbc    ebx=1b4

esp=12fdb0    ebp=2000      esi=12fdc8    edi=12fdb4     EFL 44 P Z

dbg> Disassemble address (default eip): (hex/reg) 0x401221401221Number of instructions to dump (max 100): (int/reg) 100100401221   83F8FF                          cmp eax,0xffffffff401224   74E3                            jz 0x401209   ^^401226   3D00100000                      cmp eax,0x100040122b   7CDC                            jl 0x401209   ^^40122d   89C5                            mov ebp,eax40122f   89E0                            mov eax,esp401231   31C9                            xor ecx,ecx401233   51                              push ecx401234   50                              push eax401235   6A04                            push byte 0x4401237   57                              push edi401238   53                              push ebx401239   FF5630                          call [esi+0x30]40123c   813F25504446                    cmp dword [edi],0x46445025401242   75C5                            jnz 0x401209   ^^401244   83C408                          add esp,0x8...

dbg> Set eip (VA or file offset) : (hex/reg) 0x401244401244401244   83C408                          add esp,0x8dbg>40125a  VirtualAlloc(base=0 , sz=1ffc) = 731000401265  ReadFile(hFile=1b4, buf=731000, numBytes=1ffc) = 04012b0  GetTempPathA(len=c8, buf=12fcfc) = 254012be  GetTempFileNameA(path=C:\Users\SEVIEZ~1\AppData\Local\Temp\, prefix=12fcf8, unique=0, buf=12f

cfc) = 429E

         Path = C:\Users\SEVIEZ~1\AppData\Local\Temp\429E.tmp4012e0  CreateFileA(C:\Users\SEVIEZ~1\AppData\Local\Temp\429E.tmp) = 8SafeMalloc Failed/refused to allocate 0x0 bytes exiting...

一开始分析就会陷入一个死循环,然后尝试改变eip得到了一些api的调用。

转换shellcode为exe

还是看不出什么,这里我们把shellcode转换成exe文件来分析,首先我尝试了shellcode2exe.py,可转换结果并不是一个合法的exe文件,这里讲一个通用的方法,这里要用到yasm.exegolink.exe,下载地址:

yasm-1.3.0-win64.exe

yasm-1.3.0-win32.exe

golink

下载对应位数的yasmgolink,分别重命名为yasm.exegolink.exe

然后用winhex等十六进制编辑器把shellcode保存为shellcode.bin:

$ hexdump shellcode.bin0000000 e8 00 00 00 00 5d 83 ed 05 e9 8b 00 00 00 52 500000010 31 d2 31 c0 80 f9 01 75 04 66 ad eb 01 ac 3c 000000020 74 0d 3c 61 72 02 2c 20 c1 ca 0d 01 c2 eb e3 390000030 da 58 5a c3 56 89 da b2 3c 31 c0 66 8b 02 01 d80000040 8b 50 78 01 da 52 51 8b 4a 18 8b 42 20 01 d8 8b

...

然后新建一个文件shellcode.asm,内容如下:

$ cat shellcode.asm

Global StartSECTION 'foo' write, execute,readStart:

incbin "shellcode.bin"

最后把yasm.exegolink.exeshellcode.asmshellcode.bin放在同一个目录下,以32位系统为例,依次执行如下命令:

yasm.exe -f win32 -o shellcode.obj shellcode.asmgolink /ni /entry Start shellcode.obj

最后可以得到shellcode.exe:

C:\Users\seviezhou\Desktop>yasm.exe -f win32 -o shellcode.obj shellcode.asmC:\Users\seviezhou\Desktop>golink /ni /entry Start shellcode.objC:\Users\seviezhou\Desktop>dir shellcode.exe

 驱动器 C 中的卷没有标签。

 卷的序列号是 0A63-F3E0
 C:\Users\seviezhou\Desktop 的目录2017/11/02  20:18             2,048 shellcode.exe               1 个文件          2,048 字节               0 个目录 49,720,483,840 可用字节

然后就可以放到debugger中调试:

00401000 > $ E8 00000000    CALL shellcod.00401005                   ; \shellcod.0040100500401005   $ 5D             POP EBP00401006   . 83ED 05        SUB EBP,500401009   . E9 8B000000    JMP shellcod.004010990040100E  /$ 52             PUSH EDX0040100F  |. 50             PUSH EAX00401010  |. 31D2           XOR EDX,EDX00401012  |> 31C0           /XOR EAX,EAX

可以看到入口点确实是shellcode的起始位置,单步跟随后可以在栈上找到程序使用的api:

0012FF54   7685214F  kernel32.ExitProcess0012FF58   76852FB6  kernel32.VirtualAlloc0012FF5C   7684A629  kernel32.DeviceIoControl0012FF60   7684CEE8  RETURN to kernel32.CreateFileA0012FF64   7684CAC4  kernel32.GetCurrentProcessId0012FF68   7685395C  kernel32.LoadLibraryA0012FF6C   7688E5FD  kernel32.WinExec0012FF70   76851400  kernel32.WriteFile0012FF74   7684CA7C  kernel32.CloseHandle0012FF78   76866A65  kernel32.GetTempPathA0012FF7C   7686695F  kernel32.GetTempFileNameA0012FF80   76840273  kernel32.GetFileSize0012FF84   768496FB  kernel32.ReadFile0012FF88   7684DB36  kernel32.SetFilePointer

然后就可以分析shellcode了,当然也可以放到IDA中分析。

也可以把上述两条命令写成shellcode2exe.bat文件:

@echo off

@if "%1"=="" goto help

@echo Global Start > shellcode.asm

@echo SECTION 'foo' write, execute,read >> shellcode.asm

@echo Start:       >> shellcode.asm

@echo incbin "%2"  >> shellcode.asm

@yasm.exe -f win%1 -o shellcode.obj shellcode.asm

@golink /ni /entry Start shellcode.obj

@dir shellcode.exe

@goto exit@:help

@echo Converts shellcode to exe

@echo Required Arguments:

@echo arg1 - architecture: 32 or 64 @echo arg2 - shellcode file name

@echo current dir is %cd%

@:exitecho.

运行结果:

C:\Users\seviezhou\Desktop>shellcode2exe.bat

Converts shellcode to exe

Required Arguments:

arg1 - architecture: 32 or 64arg2 - shellcode file name

current dir is C:\Users\seviezhou\DesktopC:\Users\seviezhou\Desktop>shellcode2exe.bat 32 shellcode.bin

 驱动器 C 中的卷没有标签。

 卷的序列号是 0A63-F3E0
 C:\Users\seviezhou\Desktop 的目录2017/11/02  20:26             2,048 shellcode.exe               1 个文件          2,048 字节               0 个目录 49,720,455,168 可用字节

成功得到exe文件。

总结

当分析shellcode时,可以结合多种方法分析,静态或者动态,才能更好的分析代码的行为,这时能够转换成可执行文件分析就是很好的方法。












本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1979824 ,如需转载请自行联系原作者



相关文章
|
数据可视化 数据挖掘 开发工具
【办公自动化】用Python批量从上市公司年报中获取主要业务信息
【办公自动化】用Python批量从上市公司年报中获取主要业务信息
1922 0
|
人工智能 安全 机器人
重磅发布的「AI视频通话」如何10分钟就实现?
2024年,OpenAI发布GPT-4o,支持文本、音频和图像的组合输入与输出,使交互更接近自然交流。传统语音助手需经历多阶段处理,容易出现延迟或误解,体验感差。本文介绍如何在阿里云上快速创建可视频通话的AI智能体,实现拟人化交互、精准感知、情绪捕捉等功能,提供高质量、低延时的音视频通话体验。通过简单的部署流程,用户可以轻松创建并体验这一先进的人机交互技术。点击“阅读原文”参与活动赢取惊喜礼物。
|
存储 前端开发 区块链
基于区块链的慈善捐赠平台:透明与信任的未来
基于区块链的慈善捐赠平台:透明与信任的未来
735 24
|
供应链 安全 算法
签名不等于可信:详解PE数字签名校验的漏洞与主动规避方案
本文探讨了CVE-2013-3900漏洞的原理及其影响,该漏洞允许攻击者在不破坏数字签名有效性的情况下,向PE文件中添加恶意代码。漏洞源于Windows对签名数据后附加数据的校验缺失,导致恶意软件可伪装成合法软件。文章分析了WinVerifyTrust函数的工作机制及修复方法,包括通过注册表启用严格签名校验(EnableCertPaddingCheck)。同时,提出了通过hook注册表函数主动规避漏洞的方法,确保安全软件在未启用严格校验时仍能检测潜在威胁。此研究对提升PE文件签名安全性具有重要意义。
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
1110 2
|
JavaScript 前端开发 C++
vscode编辑器中如何调试nextjs代码
代码可调式的重要性不言而喻。 对于Programer来说,自己编写的程序能够被优雅调试是一件幸福的事情,特别是习惯了后端程序调试的开发者... 在折腾Nextjs项目的日子里,我走了很多弯路才弄明白在vs code中如何优雅的调试代码。
1941 1
vscode编辑器中如何调试nextjs代码
|
安全 API 数据安全/隐私保护
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(一)
欢迎访问我的原站!本文详细介绍了程序脱壳技术,包括壳的定义、作用、执行过程、OEP(原始入口点)的概念及查找方法。文章通过多个实例,逐步演示了如何使用OD(OllyDbg)等工具进行脱壳操作,涵盖了压缩壳、加密壳等多种类型的壳。内容详尽,适合逆向工程初学者深入学习。[点击查看原文](https://www.oisec.cn/index.php/archives/520/)
2226 1
|
安全 关系型数据库 Linux
高危漏洞CVE-2024-38077的修复指南
根据2024年8月9日,国家信息安全漏洞共享平台(CNVD)收录了Windows远程桌面许可服务远程代码执行漏洞(CNVD-2024-34918,对应CVE-2024-38077)。未经身份认证的攻击者可利用漏洞远程执行代码,获取服务器控制权限。目前,该漏洞的部分技术原理和概念验证伪代码已公开,厂商已发布安全更新完成修复。CNVD建议受影响的单位和用户安全即刻升级到最新版本。
|
Web App开发 安全 云计算
H3C任意命令执行漏洞
H3C任意命令执行漏洞
417 1