dewolf icon indicating copy to clipboard operation
dewolf copied to clipboard

[Crash][Operations] AttributeError: 'UnknownExpression' object has no attribute 'size'

Open mm4rks opened this issue 2 years ago • 1 comments

What happened?

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib64/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/home/user/.tools/binaryninja/plugins/../python/binaryninja/plugin.py", line 928, in run
    self.task.run()
  File "/home/user/.binaryninja/plugins/dewolf/__init__.py", line 41, in run
    decompile(self.bv, self.function)
  File "/home/user/.binaryninja/plugins/dewolf/__init__.py", line 24, in decompile
    task = decompiler.decompile(function, options)
  File "/home/user/.binaryninja/plugins/dewolf/decompile.py", line 55, in decompile
    pipeline.run(task)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/pipeline.py", line 97, in run
    instance.run(task)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/register_pair_handling.py", line 40, in run
    self._def_map, self._use_map, self._locations = self._parse_cfg(self.cfg)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/register_pair_handling.py", line 57, in _parse_cfg
    use_map.add(instruction)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/maps.py", line 51, in add
    self._map[used].add(instruction)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/pseudo/expressions.py", line 64, in __hash__
    return hash(repr(self))
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/pseudo/instructions.py", line 173, in __repr__
    return f"{repr(self._destination)} = {repr(self._value)}"
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/pseudo/operations.py", line 187, in __repr__
    return f"{self.operation.name} [{','.join(map(repr, self._operands))}] {self.type}"
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/pseudo/operations.py", line 240, in type
    return max(operand_types, key=lambda type: type.size)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/structures/pseudo/operations.py", line 240, in <lambda>
    return max(operand_types, key=lambda type: type.size)
AttributeError: 'UnknownExpression' object has no attribute 'size'

How to reproduce?

decompile main() of curl binary curl.zip

Affected Binary Ninja Version(s)

3.1.3703-dev (Build ID 2713759a)

mm4rks avatar Sep 17 '22 12:09 mm4rks

Version 3.1.3469 (Build ID 93650e26) yields the following crash:

Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/home/user/.tools/binaryninja/plugins/../python/binaryninja/plugin.py", line 928, in run
    self.task.run()
  File "/home/user/.binaryninja/plugins/dewolf/__init__.py", line 41, in run
    decompile(self.bv, self.function)
  File "/home/user/.binaryninja/plugins/dewolf/__init__.py", line 24, in decompile
    task = decompiler.decompile(function, options)
  File "/home/user/.binaryninja/plugins/dewolf/decompile.py", line 55, in decompile
    pipeline.run(task)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/pipeline.py", line 97, in run
    instance.run(task)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/missing_definitions.py", line 99, in run
    self.insert_missing_definitions()
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/missing_definitions.py", line 133, in insert_missing_definitions
    self._insert_definition_if_undefined(variable, previous_ssa_labels, undefined_variables)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/missing_definitions.py", line 158, in _insert_definition_if_undefined
    self._insert_definition_of_aliased(variable, previous_ssa_labels)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/missing_definitions.py", line 173, in _insert_definition_of_aliased
    self._check_definition_is_insertable(variable)
  File "/home/user/.binaryninja/plugins/dewolf/decompiler/pipeline/preprocessing/missing_definitions.py", line 286, in _check_definition_is_insertable
    raise ValueError(error_message)
ValueError: Memory version 30 does not exist. So we can not insert the definition of the aliased variable data_2df80#30.

mm4rks avatar Sep 22 '22 07:09 mm4rks

/cib

mm4rks avatar Jan 17 '23 10:01 mm4rks

binaryninja.types.EnumerationType gets lifted as UnknownExpression (lift_unknown()). This leads to Operation.type being an UnknownExpression and therefore AttributeError happens.

Fix: lift EnumerationType as CustomType by registering in TypeHandler

mm4rks avatar Jan 17 '23 10:01 mm4rks