LingMo0412
yaoqianshuj
感谢大佬的回复,我读了你的文章学习了很多,我现在正在用triton恢复一个arm下的ollvm的混淆,但是我发现triton的行为可能 ...
for line in ori_instructions:
addr_str, inst_text, registers_mems = line.split(':')
inst = Instruction()
inst.setAddress(int(addr_str, 16))
inst.setOpcode(assemble(inst_text.strip()))
if "memoryread=((" in line:
# 提取 addr:0x..., size:...
# 简单的正则或 split 提取
import re
reads = re.findall(r"addr-(0x[0-9a-fA-F]+),value-(0x[0-9a-fA-F]+),size-(\d+)", line)
for mem_addr_str, mem_value_str, mem_size_str in reads:
m_addr = int(mem_addr_str, 16)
m_value = int(mem_value_str, 16)
m_size = int(mem_size_str)
print(f"[*] Detected memory read in instruction at {hex(inst.getAddress())} with address {hex(m_addr)}, value {hex(m_value)}, and size {m_size} bytes")
for i in range(m_size):
memi = MemoryAccess(m_addr + i, CPUSIZE.BYTE)
#if (ctx.isConcreteMemoryValueDefined(m_addr, m_size)):
ctx.setConcreteMemoryValue(m_addr + i, 0)
ctx.symbolizeMemory(memi, f"mem_{m_addr + i}")
print(f"[*] Memory at {hex(m_addr + i)} symb: {ctx.getSymbolicMemory(m_addr + i)}")
#print(f"[*] Found memory read at {hex(m_addr)} with size {m_size} bytes")
# 符号化内存
#set_memory_bytes(ctx, m_addr, m_value, m_size) # 初始化内存值为0
#ctx.symbolizeMemory(MemoryAccess(m_addr, m_size), f"mem_at_{hex(m_addr)}")
ctx.processing(inst)
#w8_expr = ctx.getSymbolicRegister(ctx.getRegister("w8")).getAst()
#print("W8 AST Structure:", w8_expr)
#ctx.symbolizeRegister(ctx.getRegister("x8"), "x8")
# 强制检查 w8
w8_reg = ctx.getRegister("w8")
w8_ast = ctx.getSymbolicRegister(w8_reg)
print(w8_ast)
这段是模拟执行的代码,就是边执行边把trace里的memory按字节符号化,然后在模拟执行之前把所有寄存器都先赋好了concrete值再符号化,我看了一下和你文章里的逻辑基本都是一样的,这几个mode前两个我之家了第一个