-
-
未解决
请教一个关于unicorn的emu_start()在指定了始末地址的情况下模拟执行无法停下的问题
-
发表于:
2020-12-20 09:17
2933
-
未解决 请教一个关于unicorn的emu_start()在指定了始末地址的情况下模拟执行无法停下的问题
(初次发帖 格式可能有点乱 望见谅)
打扰一下大家,想请教一个关于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期)