首页 > 其他分享 >Unicorn 初探

Unicorn 初探

时间:2023-02-14 12:22:16浏览次数:34  
标签:write address mu Unicorn 初探 reg UC size

前言

笔者由于对IOT比较感兴趣,故经常需要模拟一些IOT的固件,之前我习惯直接直接使用qemu对固件进行模拟。这几天由于任务需要接触了一下unicorn,一个轻量级, 多平台, 多架构的CPU 模拟器框架。它基于qemu,但是提供了很多API这使得我们可以方便的读写寄存器的值等内容。我们可以通过它进行调用目标二进制中的目标函数、用于模糊测试、模拟执行一些混淆代码等等。

安装

笔者更偏向于使用python,故在linux可以通过如下方法安装。对于那些想要使用C的用户, 则可能需要去官网查看文档编译源码包。

pip install unicorn

python常用API

模拟器初始化:Uc(arch, mode)
内存映射:mem_map(address, size, perms=uc.UC_PROT_ALL)
向内存中写入数据:mem_write(address, data)
从内存中读出数据:mem_read(address, size)
向寄存器中写入值:reg_write(reg_id, value)
从寄存器中读出值:reg_read(reg_id)
添加hook:hook_add(htype, callback, user_data=None, begin=1, end=0, arg1=0)

初次使用Unicorn模拟程序执行

hxp CTF 2017 Fibonacci为例

from unicorn import *
from unicorn.x86_const import *


mu = Uc(UC_ARCH_X86, UC_MODE_64)

BASE = 0x400000
STACK_ADDR = 0x0
STACK_SIZE = 1024*1024

mu.mem_map(BASE, 1024*1024)
mu.mem_map(STACK_ADDR, STACK_SIZE)

mu.mem_write(BASE, open('./fibonacci','rb').read())
mu.reg_write(UC_X86_REG_RSP, STACK_ADDR + STACK_SIZE - 1)

instructions_skip_list = [0x00000000004004EF, 0x00000000004004F6, 0x0000000000400502, 0x000000000040054F]

def hook_code(mu, address, size, user_data):
	#print('>>> Tracing instruction at 0x%x, instruction size = 0x%x' %(address, size))

	if address in instructions_skip_list:
		mu.reg_write(UC_X86_REG_RIP, address+size)
	
	elif address == 0x400560 or address == 0x400575:
		c = mu.reg_read(UC_X86_REG_RDI)
		print(chr(c))
		mu.reg_write(UC_X86_REG_RIP, address+size)


mu.hook_add(UC_HOOK_CODE, hook_code)

mu.emu_start(0x4004E0, 0x400582)

标签:write,address,mu,Unicorn,初探,reg,UC,size
From: https://www.cnblogs.com/pwnfeifei/p/17099671.html

相关文章

  • 初探富文本之CRDT协同算法
    初探富文本之CRDT协同算法CRDT的英文全称是Conflict-freeReplicatedDataType,最初是由协同文本编辑和移动计算而发展的,现在还被用作在线聊天系统、音频分发平台等等。当......
  • 应用部署初探:微服务的3大部署模式
    在之前的文章中,我们已经充分了解了应用部署的4种常见模式(金丝雀部署、蓝绿部署、滚动部署及影子部署)。随着云原生技术逐步成熟,企业追求更为灵活和可扩展的系统,微服务架构大......
  • 应用部署初探:微服务的3大部署模式
    在之前的文章中,我们已经充分了解了应用部署的4种常见模式(金丝雀部署、蓝绿部署、滚动部署及影子部署)。随着云原生技术逐步成熟,企业追求更为灵活和可扩展的系统,微服务架构大......
  • 基于 Kubernetes 的企业级大数据平台,EMR on ACK 技术初探
    作者:容器服务团队云上大数据的Kubernetes技术路线当前,大数据与机器学习领域颇为关注存储与计算分离架构,逐渐向云原生演进。以Spark为例,云下或自有服务器可以选择Hado......
  • 【JS】node.js初探
    原本只是为了方便在VSCode中调试JS代码安装了node.js,但最近看了许多关于node.js的文章,心血来潮打算用JS写写后端。1.理解node.js懂一些JavaScript和开发Node.js......
  • HarmonyOS初探01——下载安装DevEco Studio
    HUAWEIDevEcoStudio(简称DevEcoStudio)是基于IntelliJIDEACommunity开源版本打造,面向华为终端全场景多设备的一站式集成开发环境(IDE),为开发者提供工程模板创建、开发、编......
  • Qml调用C++方法初探
    为什么会在QML中调用C++方法?引入Qml的一个重要目的就是UI和逻辑的解耦,我们可以把业务逻辑用C++实现,Qml只用来开发界面,这样在后续程序改版过程中,基本上可以不动逻辑只改UI比......
  • cls初探
    什么是clscls对应ceph原文件中的src/cls目录,在官方文档EXTENDINGCEPH中有对这个概念作出介绍:YoucanextendCephbycreatingsharedobjectclassescalled‘Ceph......
  • 一文初探 Goroutine 与 channel
    耐心和持久胜过激烈和狂热。哈喽大家好,我是陈明勇,本文介绍的内容是​​Go​​​并发模块的两个重要角色→​​goroutine​​​与​​channel​​​。如果本文对你有帮......
  • 借助Radamsa变异数据(初探)
    Radamsa介绍Radamsa是一款测试用例生成器,通常用来测试程序对格式错误和潜在恶意输入的承受能力(对程序进行模糊测试)。它通过你的输入来返回变异后的数据。它的主要卖点是,......