def getReg(my_node, name): v = cfa.Value('reg', name, cfa.reg_len(name)) # hardcoded first unrel try: return my_node.unrels["0"][v][0] except KeyError: return my_node.unrels[list(my_node.unrels.keys())[0]][v][0]
def setRegVal(my_state, name, value, vtop=0, taint=0, ttop=0): if name == 'esp': region = 's' else: region = 'g' regval = cfa.Value(region, value, cfa.reg_len(name), vtop=vtop, taint=taint, ttop=ttop) setReg(my_state, name, regval)
def compare(self, tmpdir, asm, regs=None, reg_taints={}, top_allowed={}): testname = inspect.stack()[1][3] hline = "\n=========================\n" if regs is None: regs = self.ALL_REGS bctest = self.make_bc_test(tmpdir, asm) bincat = self.run_bc_test(bctest, testname) try: cpu = self.cpu_run(tmpdir, bctest.filename) except subprocess.CalledProcessError as e: pytest.fail("%s: %s\n%s" % (testname, e, bctest.listing)) diff = [] same = [] diff_summary = [] for r in regs: regspec = r.split(":") r = regspec[0] rl = (cfa.reg_len(r) + 3) // 4 bitfield = regspec[1:] mask = self.bf2mask(bitfield) maskstring = "" if mask == -1 else f" (mask={mask:0{rl}x})" vtop = bincat[r].vtop value = bincat[r].value if cpu[r] & ~vtop & mask != value & ~vtop & mask: diff.append(f"- cpu : {r} = {cpu[r]:0{rl}x}") diff.append(f"+ bincat: {r} = {value:0{rl}x} {bincat[r]}") diff_summary.append(r) else: same.append( f" both : {r} = {value:0{rl}x} {bincat[r]}{maskstring}" ) allow_top = top_allowed.get(r, 0) if vtop & ~allow_top & mask: diff.append( f"+ top allowed: {r} = {cpu[r]:0{rl}x} ? {allow_top:0{rl}x}" ) diff.append( f"+ bincat : {r} = {value:0{rl}x} ? {vtop:0{rl}x} {bincat[r]}" ) diff_summary.append("%s(top)" % r) assert not diff, ("%s: (%s)" % (testname, ", ".join(diff_summary)) + hline + bctest.listing + hline + "\n".join(diff) + hline + "\n".join(same)) diff = [] diff_summary = [] for r, t in reg_taints.items(): rl = (cfa.reg_len(r) + 3) // 4 if bincat[r].taint != t: diff.append( f"- expected : {r} = {cpu[r]:0{rl}x} ! {t:0{rl}x}") diff.append( f"+ bincat : {r} = {bincat[r].value:0{rl}x} ! {bincat[r].taint:0{rl}x} {taint, bincat[r]}" ) diff_summary.append(r) else: same.append( f" both : {r} = {bincat[r].value:0{rl}x} ! {bincat[r].taint:0{rl}x} {taint, bincat[r]}" ) assert not diff, ("%s: (%s)" % (testname, ", ".join(diff_summary)) + hline + "\n".join(diff) + "\n=========================\n" + "\n".join(same))
def getReg(my_node, name): v = cfa.Value('reg', name, cfa.reg_len(name)) # hardcoded first unrel return my_node.unrels["0"][v][0]
def getReg(my_state, name): v = cfa.Value('reg', name, cfa.reg_len(name)) return my_state[v][0]
def setReg(my_state, name, regval): v = cfa.Value('reg', name, cfa.reg_len(name)) my_state[v] = [ regval ]