Unicorn批量模拟执行爆破实践

news2025/2/26 13:15:54

实践题目:CFI-CTF 2018 Automated Reversing
代码与附件地址:https://github.com/Airrcat/unicorn_loader

目标附件如:
在这里插入图片描述
每份附件的代码大致如下:
在这里插入图片描述

简单来说,程序会接收命令行参数并作一个字节的运算后与一固定值的字节变量进行比较,若匹配则返回0,不同程序进行的运算、比较值不同,由此可得逆推出不同的命令行参数。

但此题因为附件甚多,共有1009个附件,手动不好做,官方题解是提取运算的操作码、操作数来计算是什么结果。
而我觉得这题格式简单且批量,很适合来做Unicorn批量模拟执行的实践。

两部分

  1. 单步trace,根据当前ip做操作:
def trace(mu: Uc, address, size, data):
    global check
    global boom
    EIP = mu.reg_read(unicorn.x86_const.UC_X86_REG_EIP)
    if EIP == 0x19:
        mu.reg_write(unicorn.x86_const.UC_X86_REG_DL,boom) # 写入爆破值
    if EIP == 0x1f:
        if mu.reg_read(unicorn.x86_const.UC_X86_REG_FLAGS)&(2**6)==(2**6): # check zf
                check = 1
                mu.emu_stop()
                return
    if EIP > 0x30:
        mu.emu_stop()
  1. 遍历文件与值爆破
from pe_loader.pe_loader import  *
from unicorn import *
check = 0
boom = 0

anwsers = []
for suffix in range(0,1009):
    path = "attachment/binaries/"
    prefix = "binary"
    if suffix == 993:
        continue
    # 正常来说,这里能从pe信息里获取实地址、虚拟地址、大小等信息,但是我的elf结构体没做完。
    loader = pe_loader(path + prefix+ str(suffix),UC_MODE_32)
    vaddr = 0
    vsize = 0xdf - 0xb0
    raddr = 0xb0
    rsize = 0xdf - 0xb0
    content = loader.image[raddr:raddr + rsize]

    CODE = content
    BASE_ADDR = vaddr
    CODE_LEN = vsize

    uc = unicorn.Uc(UC_ARCH_X86,UC_MODE_32)
    # 整体内存空间的初始化
    uc.mem_map(BASE_ADDR,32*1024)
    uc.mem_write(BASE_ADDR,b'\x00'*32*1024)
    # 栈空间初始化,因为内存刚刚整体写了,这里其实可以不用。
    STACK = b'\x00' * 1024
    STACK_POINT = 30 * 1024
    uc.reg_write(unicorn.x86_const.UC_X86_REG_SP,STACK_POINT)
    # 代码段初始化
    uc.mem_write(BASE_ADDR,CODE)
    # 添加hook点,trace
    uc.hook_add(UC_HOOK_CODE, trace)
    for i in range(0,0xff):
        # 对应程序return 1
        if check == 1:
            anwsers.append(boom)
            check = 0
            break
        try:
            boom = i
            uc.emu_start(BASE_ADDR, rsize)
        except UcError as e:
            print("ERROR ", e)
    uc.mem_unmap(BASE_ADDR,32*1024)
    # clear,防止因为开了过多的模拟进程出现qemu的Could not allocate dynamic translator 错误
    import gc
    del uc
    gc.collect()

with open("attachment/binaries/anwser.txt","wb") as f:
    f.write(bytes(anwsers))

注意最后一个点:

    # clear,防止因为开了过多的模拟进程出现qemu的Could not allocate dynamic translator 错误
  import gc
  del uc
  gc.collect()

根据https://github.com/unicorn-engine/unicorn/issues/508这个issue以及我们一般能检索到的说法,这个错误是由qemu、unicorn以及python本身的资源管理问题。emu在stop后似乎无法自动,良好地释放资源,于是在过多的批量启动时就出现了资源分配错误。而我在尝试了手动gc后发现此问题能得到良好的解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

转型技术管理:九大步骤解锁高效管理新境界

文章目录 引言一、寻求反馈二、从员工的角度看待问题三、总览全局四、管理自己的情绪五、赞赏员工的出色工作六、在人前支持员工七、管理自己的职业生涯八、认识到自己也许存在偏见,与不同于自己的人交流九、在工作中建立信任和沟通总结 引言 在快速变化的科技浪潮…

SparkSQL的分布式执行引擎-Thrift服务:学习总结(第七天)

系列文章目录 SparkSQL的分布式执行引擎 1、启动Thrift服务 2、beeline连接Thrift服务 3、开发工具连接Thrift服务 4、控制台编写SQL代码 文章目录 系列文章目录前言一、SparkSQL的分布式执行引擎(了解)1、启动Thrift服务2、beeline连接Thrift服务3、开发工具连接Thrift服务4、…

opencascade AIS_InteractiveContext源码学习相关枚举 AIS_SelectionScheme AIS_StatusOfPick

AIS_SelectionScheme 枚举 AIS_SelectionScheme 设置交互上下文中的选择方案。 枚举值: AIS_SelectionScheme_UNKNOWN 未定义的方案 AIS_SelectionScheme_Replace 清除当前选择并选择检测到的对象 AIS_SelectionScheme_Add 将检测到的对象添加到当前选择 AIS_…

【Kubernetes项目部署】k8s集群+高可用、负载均衡+防火墙

项目架构图 (1)部署 kubernetes 集群 详见:http://t.csdnimg.cn/RLveS (2) 在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上; Pod使用hostP…

智慧学习实践系统的设计

管理员账户功能包括:系统首页,个人中心,企业管理,任务管理,公告管理,菜单管理,用户管理,基础数据管理 企业账户功能包括:系统首页,个人中心,任务…

电商API接口详述:涵盖订单、库存等多功能接口介绍

电商商家自研管理系统,线下ERP系统或WMS系统想要接入电商平台订单打单发货,通过点三电商API可以一键对接多个电商平台,帮助商家、ERP/WMS服务商快速开发电商模块,实现电商业务管理功能,那么点三电商API接口有哪些可用接…

省市区下拉选择:3个el-select(附完整代码+json)

目录 直接上做出的效果: 页面代码: 使用click.native: data及引入: 初始化: methods: JSON: 示例结构: 1.code.json 2.pca-code.json 回显: 视频效果: 直接上做出…

盘点下常见 HDFS JournalNode 异常的问题原因和修复方法

盘点下常见 HDFS JournalNode 异常的问题原因和修复方法 最近在多个客户现场以及公司内部环境,都遇到了因为 JournalNode 异常导致 HDFS 服务不可用的问题,在此总结下相关知识。 1 HDFS HA 高可用和 JournalNode 概述 HDFS namenode 有 SPOF 单点故障…

MS3121地隔离放大器

MS3121 是一款应用于车载音频系统的地隔离放大 器。芯片可以很好地解决汽车音频系统中的绕线电阻问 题,以及由车载电子设备带来的噪声问题。另外,芯片 所需要的外围电容小,便于系统的集成。注意,芯片的 地电位需要和后级音频功…

Mac数据如何恢复?3 款最佳 Mac 恢复软件

如果您认为 Mac 上已删除的文件永远丢失了,那您就大错特错了!实际上,即使您清空了 Mac 上的垃圾箱,也有许多解决方案可以帮助您恢复已删除的文件。最好的解决方案之一是 Mac 恢复删除软件。最好的Mac 恢复删除应用程序可以轻松准确…

docker部署ClamAV集成java和python实现文件病毒扫描

介绍 官方文档:https://docs.clamav.net/manual/Signatures/DatabaseInfo.html ClamAV 是一个开源的反病毒引擎,它由多个模块组成,负责不同的任务处理。以下是 ClamAV 的主要模块和它们的功能: clamd:clamd 是 Clam…

Cookie、Session、Token的关系和区别

关系 Session与Cookie:Session通常依赖于Cookie来工作。当服务器为客户端创建一个Session时,它会在服务器上存储与客户端相关的信息,并将一个唯一的SessionID通过Cookie发送给客户端。客户端在后续的请求中会携带这个Cookie(包含…

视频监控管理平台的日志功能的重要性

日志功能的重要性 视频监控平台在日常工作生活中越来越重要,具有完备的平台日志,不仅可以增强视频监控系统的自身安全性,还能在更大程度上保障社会的安全与稳定。 (一)安全保障 视频监控平台作为安全防护…

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8)

流媒体学习之路(WebRTC)——音频NackTracker优化思路(8) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实…

C51学习归纳13 --- AD/DA转换

AD/DA转换实现了计算机和模拟信号的连接,扩展了计算机的应用场景,为模拟信号数字化提供了底层支持。 AD转换通常是多个输入通道,使用多路选择器连接到AD开关,实现AD多路复用的目的,提高利用率。 AD/DA转换可以使用串口…

电脑怎么卸载软件?多个方法合集(2024年新版)

在电脑的日常使用中,我们经常需要安装各种软件来满足不同的需求,但随着时间的推移,可能会出现一些软件不再需要或需要更换的情况。此时,及时从电脑上卸载这些不必要的软件是非常重要的。它不仅可以释放硬盘空间,还可以…

Stable Diffusion 设计 Logo 成品惊艳,比起人类手工设计的有什么不足之处?

Stable Diffusion不仅可以创作出精美的绘画作品,还能通过简单的prompt生成logo图案,并进一步衍生出更多的视觉海报和banner。 checkpoint ReV Animated ReV Animated - v1.2.2-EOL | Stable Diffusion Checkpoint | Civitai 这是我个人最喜欢的 2.5/3…

最小公倍数的求法

什么是最小公倍数? 最小公倍数是指两个或多个整数共有的最小正整数倍数。 如何求一组数据的最小公倍数(Least Common Multiple,简称LCM)? LCM 这组数据的公倍数 这组数据的最大公约数 (Greatest Common Divis…

redis-基础篇(1)

黑马redis-基础篇笔记 1. 初识redis REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的…

利用Systemverilog+UVM搭建SOC及ASIC的RTL验证环境

在集成电路设计的复杂世界中,验证环节是确保设计满足预期功能和性能要求的关键步骤。随着系统级芯片(SOC)和特定应用集成电路(ASIC)的规模和复杂性不断增加,传统的验证方法已经难以满足高效、准确的验证需求…