首页
社区
课程
招聘
未解决 请教一个关于unicorn的emu_start()在指定了始末地址的情况下模拟执行无法停下的问题
发表于: 2020-12-20 09:17 2933

未解决 请教一个关于unicorn的emu_start()在指定了始末地址的情况下模拟执行无法停下的问题

2020-12-20 09:17
2933

(初次发帖 格式可能有点乱 望见谅)

打扰一下大家,想请教一个关于unicorn的问题:本人初学unicorn,跟着看雪文章实践的过程中发现在调用emu_start(0x4004E0, 0x400575)的时候,已经明确指定了起始地址和终止地址,但测试发现模拟执行会一直进行,直到逼近map的最大范围(0x4fffee)。百思不得其解,还望能有前辈不吝赐教,谢谢。
(以下是原文链接和源码:https://bbs.pediy.com/thread-224330.htm)

from unicorn import *
from unicorn.x86_const import *

import struct


def read(name):
    with open(name) as f:
        return f.read()


def u32(data):
    return struct.unpack("I", data)[0]


def p32(num):
    return struct.pack("I", num)

if __name__ == '__main__':
    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, read("./fibonacci"))
    mu.reg_write(UC_X86_REG_RSP, STACK_ADDR + STACK_SIZE - 1)

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

    mu.hook_add(UC_HOOK_CODE, hook_code)
    mu.emu_start(0x00000000004004E0, 0x0000000000400575)



原文正确的结果:

我的测试结果:首先是指令长度不正确(始终是0x2),其次是指令地址不正确,按理说是从指定的起始地址 0x4004E0开始执行,直到结束地址0x400575停下,即使中间引发异常也只是停止运行,而不是测试的样子一直运行到Invalid memory fetch(UC_ERR_FETCH_UNMAPPED)。




[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 330
活跃值: (859)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

傻了,,问题不是出在unicorn,而是在读取文件的时候应指定mode为‘rb’, 否则读不全(调试发现只读取到了0x3E个字节),未读取到的部分全用0x00填充,导致模拟执行出了错。

最后于 2021-4-13 22:28 被1earner编辑 ,原因:
2020-12-20 10:30
0
游客
登录 | 注册 方可回帖
返回
//