Example #1
0
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]
Example #2
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)
Example #3
0
    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))
Example #4
0
def getReg(my_node, name):
    v = cfa.Value('reg', name, cfa.reg_len(name))
    # hardcoded first unrel
    return my_node.unrels["0"][v][0]
Example #5
0
def getReg(my_state, name):
    v = cfa.Value('reg', name, cfa.reg_len(name))
    return my_state[v][0]
Example #6
0
def setReg(my_state, name, regval):
    v = cfa.Value('reg', name, cfa.reg_len(name))
    my_state[v] = [ regval ]