我正在进行picoCTF练习并且进行了基本的RE /汇编练习,其目的是在程序结束时基本告诉EAX的价值。我认为这是尝试Unicorn / Keystone引擎的好机会,所以我做到了。我用keystone引擎组装了两个代码变体(以摆脱跳转指令)并试图用独角兽模拟它。但是,我得到“无效内存读取(UC_ERR_READ_UNMAPPED)”异常。我收集的其中一个片段(考虑到AT& T语法):
MOV $19388,%ebx
MOV $28571,%eax
MOV $19079,%ecx
IMUL %eax,%ebx
ADD %eax,%ebx
MOV %ebx,%eax
SUB %ecx,%eax
导致以下字符串(保存在文件“assembleopt1.txt”中):
\xbb\xbc\x4b\x0\x0\xb8\x9b\x6f\x0\x0\xb9\x87\x4a\x0\x0\xf\xaf\xd8\x1\xc3\x89\xd8\x29\xc8
并尝试使用此代码运行它:
#!/usr/bin/python3
from unicorn import *
from unicorn.x86_const import *
with open("assembledopt1.txt", "rb") as file:
code = file.read()
addr = 0x1000000
print("Emulate x86")
try:
mu = Uc(UC_ARCH_X86, UC_MODE_32)
mu.mem_map(addr, 1024*1024)
mu.mem_write(addr,code)
mu.reg_write(UC_X86_REG_ECX, 0x0)
mu.reg_write(UC_X86_REG_EAX, 0x0)
mu.reg_write(UC_X86_REG_EBX, 0x0)
mu.emu_start(addr, addr+len(code))
print("Done")
r_eax = mu.reg_read(UC_X86_REG_EAX)
print("Eax: " + r_eax)
except Exception as e:
print("Err: %s" % e)
这导致前面提到的异常 我不知道我做错了什么,因为我的代码与教程非常相似,希望你能帮助我。非常感谢任何关注我的问题的人!