浅析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)

1,将结果复制到char shellcode处,并 通过如下vs程序加载shellcod

#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

点击生成解决方案,将生成的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功能不仅仅局限于这些,还有很多好玩的功能,例如自动化脱壳等。参考

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.添加断点

 # 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))

思维扩展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 反汇编模拟运行及调试方法,希望对大家有所帮助!

(0)

相关推荐

  • iOS安全防护系列之ptrace反调试与汇编调用系统方法详解

    关于系统调用 ptrace是一个系统调用.那系统调用是什么东东呢?它是一个系统提供的很强大的底层服务.用户层的框架是构建在system call之上的. macOS Sierra大约提供了500个系统调用.通过以下命令来了解你系统上的系统调用的个数: ➜ ~ sudo dtrace -ln 'syscall:::entry' | wc -l 这个命令使用了另外一个更强大的工具叫DTrace,暂不详谈它. 一 lldb调试原理:debugserver 1.xcode的lldb之所以能调试app,是

  • 浅析shellcode 反汇编模拟运行及调试方法

    onlinedisassembler https://onlinedisassembler.com 在线反汇编工具,类似于lda.功能比较单一. Any.run 等平台在线分析 将shellcode保存为文件 通过如下脚本,转换shellcode为char数组 import binascii filename = "C:\\Users\\liang\\Desktop\\工作相关\\样本\\rdpscan\\rdpscan\\ssleay32.dll" #filename = "

  • pycharm运行和调试不显示结果的解决方法

    刚在虚拟机里面安装了pycharm,配置(setting)完后,新建一个py文件,键入"hello world",竟然没有结果,虽然运行成功.pycharm太不友好了吧! 然后开始找问题: 1:有人说是文件名的问题,这个可能有,但是我没有改,我觉得我的这个很规范. 2:pyqt的auto选项,试了一下没反应. 3:还有人说版本问题,我check了最新版应该没问题,再装一次太麻烦了,也没有改. 4:还有禁掉pycharm网络的问题.太扯了吧,反正我应该不是. 都TM什么问题些!!!好不靠

  • IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解

    环境: idea2020.1 插件: LeetCode-editor 6.7 一.IDEA安装LeetCode插件 安装完成重启idea 打开插件 URL可以选择国服和世界服.LoginName和Password填自己的用户名和密码即可. 需要配置的选项为: TempFilePath: 自己保存代码的包的位置 CodeFileName: $!velocityTool.camelCaseName(${question.titleSlug}) CodeTemplate: ${question.con

  • 快速建立Servlet和JSP的运行、调试和编译环境

    相信很多刚开始学习Servlet和JSP的朋友都有一个困扰,就是如何快速方便的建立一个Servlet和JSP的运行.调试和编译环境.本人现在正在国外攻读MIT(Master of Information Technology),现在选修的这一科是WBIS(Web Based Information Systems),其包含了许多种技术,如Java,Perl,CGI,Servlet,ASP,Java Script,JSP,OO,UML等等.下面的这篇文章是学校所提供的相关软件的下载地址.安装方法以

  • Linux环境下段错误的产生原因及调试方法小结

    最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的"段错误"(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个

  • jquery模拟进度条实现方法

    本文实例讲述了jquery模拟进度条实现方法.分享给大家供大家参考.具体如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>js模拟进度条练习</title> <script type='text/javascript' src="http://xiazai.jb51.net/201508/yuanma/jquery-1.8

  • 模拟Mybatis的实现方法

    所需要用到的其他工具或技术: 项目管理工具 : Maven 测试运行工具 : Junit 数据库 : Derby XML操作工具:Dom4j 继续不废话 Maven Dependencies: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> <scope>test</sc

  • Python捕捉和模拟鼠标事件的方法

    本文实例讲述了Python捕捉和模拟鼠标事件的方法.分享给大家供大家参考.具体分析如下: 这个假期玩了不少galgame,不过有些很老的游戏没有自动运行模式,点击鼠标又太伤按键了,于是想把滚动鼠标滚轮映射为点击鼠标. 网上搜了一下,没发现什么现成的软件,而按键精灵又太重量级了,于是考虑干脆自己用Python写个算了. 这里需要把PyHook和PyWin32都装上(建议下exe版,免得安装时各种蛋疼). 翻了翻教程,发现实现起来很简单: # -*- coding: utf-8 -*- import

  • PHP模拟post提交数据方法汇总

    使用php模拟post传值虽然在日常生活中用到的不是很多,但是在某些场合还是经常用到的.下面我们小编给大家整理了三种php模拟post传值的方法,file_get_contents.curl和socket. 第一种:file_get_contents来模拟post <php function file_get_contents_post($url, $post){ $options = array( 'http'=> array( 'method'=>'POST', 'content'=

  • iOS常用调试方法之静态分析详解

    前言 在iOS项目开发过程中,常用到静态分析(Analyze).断点(BreakPoint)和控制台(Console)进行代码调试.本篇文章介绍Xcode常用调试方法之"静态分析". 本文来自360奇舞团QiShare团队投稿. 一.简介 Xcode的静态分析功能是在程序未运行的情况下,对代码的上下文语义.语法.和内存情况进行分析,可以检测出代码潜在的文本本地化问题(Localizability Issue).逻辑问题(Logic error).内存问题(Memery error).数

随机推荐