Exception Unicorn引擎内存读取无效(UC\u错误\u读取\u未映射)
我正在做picoCTF练习,并进行了一次基本的重新组装,目的是在程序结束时告诉大家EAX的价值。我想这将是一个很好的机会来尝试Unicorn/Keystone引擎,所以我就这么做了。我用keystone引擎组装了两种代码变体(以消除跳转指令),并尝试用unicorn对其进行仿真。但是,我得到了“无效内存读取(UC_ERR_read_UNMAPPED)”异常。我汇编的代码片段之一(考虑到AT&T语法): 这导致了以下字符串(保存在文件“assembledopt1.txt”中): 并尝试使用以下代码运行它:Exception Unicorn引擎内存读取无效(UC\u错误\u读取\u未映射),exception,assembly,memory-management,reverse-engineering,Exception,Assembly,Memory Management,Reverse Engineering,我正在做picoCTF练习,并进行了一次基本的重新组装,目的是在程序结束时告诉大家EAX的价值。我想这将是一个很好的机会来尝试Unicorn/Keystone引擎,所以我就这么做了。我用keystone引擎组装了两种代码变体(以消除跳转指令),并尝试用unicorn对其进行仿真。但是,我得到了“无效内存读取(UC_ERR_read_UNMAPPED)”异常。我汇编的代码片段之一(考虑到AT&T语法): 这导致了以下字符串(保存在文件“assembledopt1.txt”中): 并尝试使用以下代码
#!/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)
这会导致前面提到的异常。我不知道我做错了什么,因为我的代码和教程一非常相似,希望你们能帮助我。非常感谢所有关注我问题的人 由于代码中有一些零字节,请验证是否已将它们正确写入文本。也许可以通过反汇编程序运行它,它也可以捕获任何打字错误。哦,该死,它应该是二进制数据,而不是字符串(我指的是原始\x90等,而不是“\x90”)。当我用capstone发动机检查/拆卸时,我第一次得到的是53条指令,而不是7条。非常感谢,它现在工作正常了,我拿到了国旗!太傻了…用户名签出:D
\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)