Exception Unicorn引擎内存读取无效(UC\u错误\u读取\u未映射)

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”中): 并尝试使用以下代码

我正在做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)