shellcode 反汇编,模拟运行以及调试方法
onlinedisassembler
https://onlinedisassembler.com 在线反汇编工具,类似于lda。功能比较单一。

Any.run 等平台在线分析
- 将shellcode保存为文件
- 通过如下脚本,转换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 += "\n"
ctr = 0
ctr += 1
shellcode = shellcode[:-1] + "}"
print(shellcode)
- 将结果复制到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;
}
设置c运行库的静态编译,如图设置,将运行库设置为多线程/MT
点击生成解决方案,将生成的exe上传至Any.run去分析
如图,即可通过在线分析平台去分析shellcode。简单快捷

槽点主要有如下几方面:
- 一定要选择静态编译c运行库,因为Any.run 的运行库可能会不全。以防万一
- 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
优点
- 支持debug shellcode
- dum内存
- 重定向tcp请求到其他机器,但是不支持urlopen等函数
缺点:
- 功能较为单一,模拟运行不是很全。有时候可能执行不到某些流程。并且没有实现部分dll的导出函数
图片

下载链接
http://sandsprite.com/CodeStuff/scdbg.zip
miasm
miasm是一个python llvm写的逆向工程框架。
但是官方中提供了很多例子,我们可以直接利用官方提供的脚本去完成很多任务
miasm不仅仅支持pe文件,还支持elf等,支持x86,arm,mips等架构
miasm功能不仅仅局限于这些,还有很多好玩的功能,例如自动化脱壳等。参考
miasm 反编译shellcode

使用graphviz 加载got文件,获得如下


同理 arm的选择arm,mips选择mips处理器类型
如果不像使用官方自带,可以自己写
沙箱中运行shellcode

记录每步运行的各种寄存器的值
沙箱中运行可执行系统文件
在知道系统架构的情况下 可以选择相应系统架构的sandbox,运行shellcode,从而获得更多信息

可以支持自写dll,方便hook,如图,但是我没写

支持的系统架构如下

其他功能
- 添加断点
# 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()
- 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"
- 读写并修改系统可执行文件
例如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))
思维扩展
- sandbox加载一个pe文件
- 在pe文件中申请一段内存,存放shellcode
- 修改eip到shellcode处
- 运行
好处,可以结合pe文件自动分析,分析处该shellcode的具体行为

OD加载shellcode
方法一
需要安装Olly Advanced 插件
- 随便load一个应用程序
- Alt+m 打开内存页面,添加内存,如图
 - 将shellcode复制进去
- 设置新的eip
方法二
该方法灵活应用

如图我们可以看出,加载shellcode的方式有以下几个步骤
- 调用virtualloc申请内存,属性为可写可执行。用来存放shellcode
- 调用createprocess 执行shellcode
注意,并不是一定通过createprocess去执行shellcode。也可以通过内联汇编jmp,setThreadContext等方式去执行shellcode。理论上,只要可以修改eip,就可以执行shellcode
od中输入命令 bp createprocess
等运行shellcode的时候,od会自动停在createprocess处,也就是shellcode开始执行的位置。如图

shellcode 反汇编,模拟运行以及调试方法的更多相关文章
- Linux内核调试方法总结之反汇编
Linux反汇编调试方法 Linux内核模块或者应用程序经常因为各种各样的原因而崩溃,一般情况下都会打印函数调用栈信息,那么,这种情况下,我们怎么去定位问题呢?本文档介绍了一种反汇编的方法辅助定位此类 ...
- Angel - 模拟Kafka数据流调试FTRL的方法
Angel - 模拟Kafka数据流调试FTRL的方法 Mac或者Linux版本(Win10的Linux子系统同样适用) 创建一个目录用来安装kafka以及zookeeper等相关软件,比如,新建一个 ...
- GDB中应该知道的几个调试方法 来自陈皓
GDB中应该知道的几个调试方法 2011年2月10日陈皓发表评论阅读评论62,325 人阅读 七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询 ...
- Linux内核调试方法总结【转】
转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...
- 【转】Linux内核调试方法总结
目录[-] 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 dump_sta ...
- VxWorks操作系统shell命令与调试方法总结
VxWorks下的调试手段 主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤.思路. 1 Tornado的调试工具 嵌入式实时操作系统VxWorks和集成开发 ...
- Linux内核调试方法总结
Linux内核调试方法总结 一 调试前的准备 二 内核中的bug 三 内核调试配置选项 1 内核配置 2 调试原子操作 四 引发bug并打印信息 1 BUG()和BUG_ON() 2 ...
- 【转】GDB中应该知道的几个调试方法
文章来源:http://coolshell.cn/articles/3643.html GDB中应该知道的几个调试方法 2011年02月10日 陈皓 评论 40 条评论 70,776 人阅读 七.八 ...
- python程序的调试方法
[转自:http://blog.csdn.net/luckeryin/article/details/4477233] 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 ...
随机推荐
- 轻量级开源小程序SDK发车啦
Magicodes.WxMiniProgram.Sdk 轻量级微信小程序SDK,支持.NET Framework以及.NET Core.目前已提供Abp模块的封装,支持开箱即用. Nuget 新的包 ...
- UML之类之间的关系
UML 简介 统一建模语言(Unified Modeling Language,UML) 作用:对软件系统进行说明 如果说软件系统是一本小说的话,那么 UML 就是将小说动漫化. 也许你看过这本小说, ...
- 【Java基础总结】GUI
GUI(Graphical User Interface),图形用户接口 CLI(Command Line User Interface),命令行用户接口 1. 容器 Container GUI主要位 ...
- Sample Codes之Query features from a FeatureLayer
除了地图基本的放大缩小等功能,在webgis上的二次开发中,查询功能 通常作为需求的一部分需要我们去实现,今天就给大家详细的分析实例代码中的查询功能:Query features from a Fea ...
- LR Java脚本编写方法
之前在某一家银行也接触过java写的性能接口脚本,最近因项目,也需编写java接口性能测试脚本,脑袋一下懵逼了,有点不知道从何入手.随后上网查了相关资料,自己又稍微总结了一下,与大家共同分享哈~ 首先 ...
- 从源码角度了解SpringMVC的执行流程
目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMV ...
- 数据可视化之Matplotlib的使用
1.什么是数据可视化 数据可视化在量化分析当中是一个非常关键的辅助工具,往往我们需要通过可视化技术,对我们的数据进行更清晰的展示,这样也能帮助我们理解交易.理解数据.通过数据的可视化也可以更快速的发现 ...
- es8对object快速遍历的方法
let grade = { 'lilei' : 96, 'han' : 99 } //遍历keys console.log(Object.keys(grade)) console.log(Object ...
- [bzoj4524] [loj#2047] [Cqoi2016] 伪光滑数
Description 若一个大于 \(1\) 的整数 \(M\) 的质因数分解有 \(k\) 项,其最大的质因子为 \(Ak\) ,并且满足 \(Ak^K \leq N\) , \(Ak<12 ...
- 揭秘webpack loader
前言 Loader(加载器) 是 webpack 的核心之一.它用于将不同类型的文件转换为 webpack 可识别的模块.本文将尝试深入探索 webpack 中的 loader,揭秘它的工作原理,以及 ...