首页
社区
课程
招聘
[求助]求助关于Triton内存符号化断掉的问题
发表于: 6天前 772

[求助]求助关于Triton内存符号化断掉的问题

6天前
772

求助各位大佬,我现在正在用triton恢复一个arm下的ollvm的混淆,但是我发现triton的行为可能存在问题,不知道你之前是否遇到过
具体来说就是以下三条指令
0x4007be40:adrp x8, #0xb5000
0x4007be44:ldr x8, [x8, #0x988]
0x4007be48:ldr w8, [x8]
第二条和第三条都是load内存的指令,我用trace把指令读内存的区域全部符号化了,但是第二条指令读完w8是符号化的,第三条读完w8就不是符号化的了(w8是x8的低32位),两条指令执行完打出来的AST是下面的两条
第二条执行完:(define-fun ref!55 () (_ BitVec 64) (concat ref!54 ref!52 ref!50 ref!48 ref!46 ref!44 ref!42 ref!40)) ; LDR operation - LOAD access
第三条执行完:(define-fun ref!65 () (_ BitVec 64) (concat (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8) (_ bv0 8))) ; LDR operation - LOAD access
可以看到第三条指令执行完就全部边长常量了,不是符号了,符号化就全部断掉了。与此同时我也把每次符号化的内存都打出来了,内存都是符号化的。

请教有没有大佬遇到过这个问题。

完整代码如下,目标是用triton算出来每一个ollvm控制流平坦化后继块可能会设置的state值,然后恢复cfg


from triton import TritonContext, ARCH, Instruction, MemoryAccess, MODE, CPUSIZE
import keystone
ks = keystone.Ks(
    keystone.KS_ARCH_ARM64,
    keystone.KS_MODE_LITTLE_ENDIAN
)
def assemble(code: str) -> bytes:
    encoding, _ = ks.asm(code)
    return bytes(encoding)
# 初始化 Triton
ctx = TritonContext()
ctx.setArchitecture(ARCH.AARCH64)
ctx.setMode(MODE.AST_OPTIMIZATIONS, False)
ctx.setMode(MODE.CONSTANT_FOLDING, False)
ctx.setMode(MODE.SYMBOLIZE_INDEX_ROTATION, True)
ctx.setMode(MODE.PC_TRACKING_SYMBOLIC, False)
ctx.setMode(MODE.ALIGNED_MEMORY, True)
ctx.setMode(MODE.SYMBOLIZE_LOAD, True)
ori_instructions = [
    "0x4007be40:adrp x8, #0xb5000:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=1655211333;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249280;n=0;z=1;c=1;v=0;memoryread=();memorywrite=()",
    "0x4007be44:ldr x8, [x8, #0x988]:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1074987008;x9=1655211333;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249284;n=0;z=1;c=1;v=0;memoryread=((addr-0x40130988,value-0xb83a134000000000,size-8));memorywrite=()",
    "0x4007be48:ldr w8, [x8]:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1075002040;x9=1655211333;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249288;n=0;z=1;c=1;v=0;memoryread=((addr-0x40133ab8,value-0x0,size-4));memorywrite=()",
    "0x4007be4c:adrp x9, #0xb5000:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=1655211333;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249292;n=0;z=1;c=1;v=0;memoryread=();memorywrite=()",
    "0x4007be50:ldr x9, [x9, #0x990]:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=1074987008;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249296;n=0;z=1;c=1;v=0;memoryread=((addr-0x40130990,value-0xbc3a134000000000,size-8));memorywrite=()",
    "0x4007be54:ldr w11, [x9]:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=1075002044;x10=3221222080;x11=3221221792;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249300;n=0;z=1;c=1;v=0;memoryread=((addr-0x40133abc,value-0x0,size-4));memorywrite=()",
    "0x4007be58:subs w9, w8, #1:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=1075002044;x10=3221222080;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249304;n=0;z=1;c=1;v=0;memoryread=();memorywrite=()",
    "0x4007be5c:mul w9, w8, w9:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=4294967295;x10=3221222080;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249308;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be60:ands w8, w9, #1:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=0;x10=3221222080;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249312;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be64:cset w8, eq:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=0;x10=3221222080;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249316;n=0;z=1;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be68:subs w10, w11, #9:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=3221222080;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249320;n=0;z=1;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be6c:cset w10, gt:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=4294967287;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249324;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be70:subs w11, w11, #0xa:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=0;x11=0;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249328;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be74:cset w11, lt:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=0;x11=4294967286;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249332;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be78:eor w8, w8, w11:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249336;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be7c:orr w9, w9, w10:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=0;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249340;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be80:orn w8, w8, w9:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=0;x9=0;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249344;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be84:ands w8, w8, #1:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=4294967295;x9=0;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249348;n=1;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be88:movz w9, #0xd05e:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=0;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249352;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be8c:movk w9, #0xd265, lsl #16:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=53342;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249356;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be90:movz w8, #0x5117:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=1;x9=3529887838;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249360;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be94:movk w8, #0x257c, lsl #16:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=20759;x9=3529887838;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249364;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be98:csel w8, w8, w9, ne:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=628904215;x9=3529887838;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249368;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
    "0x4007be9c:str w8, [x19, #0x34]:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=628904215;x9=3529887838;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249372;n=0;z=0;c=0;v=0;memoryread=();memorywrite=((addr-0xbffff304,value-0x628904215,size-4))",
    "0x4007bea0:b #0x18a4:x0=1078300672;x1=3221222928;x2=1078296576;x3=1078296592;x4=1078296576;x5=4294967295;x6=1;x7=3221223176;x8=628904215;x9=3529887838;x10=0;x11=1;x12=2;x13=2;x14=0;x15=1;x16=1074993984;x17=1074245880;x18=1078206496;x19=3221222096;x20=0;x21=0;x22=0;x23=0;x24=0;x25=0;x26=0;x27=0;x28=0;x29=1078300686;x30=192;sp=3221221792;pc=1074249376;n=0;z=0;c=0;v=0;memoryread=();memorywrite=()",
]
#起始执行地址
addr = int(ori_instructions[0].split(":")[0], 16)
registers_mems = ori_instructions[0].split(":")[2]
regdump = {}
for item in registers_mems.split(";"):
    if item.startswith("memoryread") or item.startswith("memorywrite"):
        continue
         
    reg_name, reg_value = item.split("=")
    regdump[reg_name] = int(reg_value)
for i in range(31):
    reg = ctx.getRegister(f"x{i}")
    value = regdump.get(f"x{i}", 0)
    ctx.setConcreteRegisterValue(reg, value)
ctx.setConcreteRegisterValue(ctx.getRegister("sp"), regdump.get("sp", 0))
ctx.setConcreteRegisterValue(ctx.getRegister("pc"), regdump.get("pc", 0))
ctx.setConcreteRegisterValue(ctx.getRegister("N"), (regdump.get("N", 0) ))
ctx.setConcreteRegisterValue(ctx.getRegister("Z"), (regdump.get("Z", 0) ))
ctx.setConcreteRegisterValue(ctx.getRegister("C"), (regdump.get("C", 0) ))
ctx.setConcreteRegisterValue(ctx.getRegister("V"), (regdump.get("V", 0) ))
for i in range(31):
    reg = ctx.getRegister(f"x{i}")
    ctx.symbolizeRegister(reg, f"x{i}")
ctx.symbolizeRegister(ctx.getRegister("sp"), "sp")
ctx.symbolizeRegister(ctx.getRegister("pc"), "pc")
ctx.symbolizeRegister(ctx.getRegister("N"), "N")
ctx.symbolizeRegister(ctx.getRegister("Z"), "Z")
ctx.symbolizeRegister(ctx.getRegister("C"), "C")
ctx.symbolizeRegister(ctx.getRegister("V"), "V")
def set_memory_bytes(ctx: TritonContext, addr:int , value: int, size: int):
    # 将长整型转换为小端序字节数组
    # 'little' 是 AArch64 常用的字节序
    data = value.to_bytes(size, byteorder='little')
    for i in range(size):
        memi = MemoryAccess(m_addr + i, CPUSIZE.BYTE)
        ctx.setConcreteMemoryValue(addr + i, data[i])
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)
    if w8_ast:
        print(f"[SUCCESS] W8 现在是符号化的! AST: {w8_ast.getAst().isSymbolized()}")
    else:
        # 如果还是没有符号,手动“接骨”
        print("[!] 符号传播失败,手动注入符号...")
        # 这里的 4 是读取的大小,取决于 w8
        ctx.symbolizeRegister(w8_reg, "manual_w8")
    addr += 4
# 获取 AST 上下文用于构建复合约束
ast = ctx.getAstContext()
# 获取 w8 寄存器当前的符号表达式
w8_symbolic = ctx.getSymbolicRegister(ctx.getRegister("w8"))
if w8_symbolic is None:
    print("[!] 警告: W8 寄存器不是符号化的,无法求解!")
    # 强制获取当前具体值
    val = ctx.getConcreteRegisterValue(ctx.getRegister("w8"))
    print(f"[!] 当前 W8 的具体值是: {hex(val)}")
else:
    w8_expr = w8_symbolic.getAst()
    print(f"[*] 最终 W8 AST 是否包含符号: {w8_expr.isSymbolized()}")
    concrete_w8 = ctx.getConcreteRegisterValue(ctx.getRegister("w8"))
    print(f"[*] W8 的值是: {hex(concrete_w8)}")



[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回