mirror of https://github.com/ConsenSys/mythril
Fix issues with arbitrary jump dest (#1654)
parent
405277dcca
commit
842e3da3a4
@ -0,0 +1,100 @@ |
||||
import pytest |
||||
from mock import patch |
||||
|
||||
from mythril.disassembler.disassembly import Disassembly |
||||
from mythril.laser.smt import symbol_factory, BitVec |
||||
from mythril.laser.ethereum.state.environment import Environment |
||||
from mythril.laser.ethereum.state.account import Account |
||||
from mythril.laser.ethereum.state.machine_state import MachineState |
||||
from mythril.laser.ethereum.state.constraints import Constraints |
||||
from mythril.laser.ethereum.state.global_state import GlobalState |
||||
from mythril.laser.ethereum.state.world_state import WorldState |
||||
from mythril.laser.ethereum.instructions import Instruction |
||||
from mythril.laser.ethereum.transaction.symbolic import ACTORS |
||||
from mythril.laser.ethereum.transaction.transaction_models import MessageCallTransaction |
||||
from mythril.laser.ethereum.call import SymbolicCalldata |
||||
from mythril.laser.ethereum.transaction import TransactionStartSignal |
||||
from mythril.analysis.module.modules.arbitrary_jump import ( |
||||
is_unique_jumpdest, |
||||
ArbitraryJump, |
||||
) |
||||
from mythril.laser.ethereum.time_handler import time_handler |
||||
|
||||
|
||||
def get_global_state(constraints): |
||||
"""Constructs an arbitrary global state |
||||
|
||||
Args: |
||||
constraints (List[BitVec]): Constraints list for the global state |
||||
|
||||
Returns: |
||||
[GlobalState]: An arbitrary global state |
||||
""" |
||||
active_account = Account("0x0", code=Disassembly("60606040")) |
||||
environment = Environment( |
||||
active_account, None, SymbolicCalldata("2"), None, None, None, None |
||||
) |
||||
world_state = WorldState() |
||||
world_state.put_account(active_account) |
||||
state = GlobalState(world_state, environment, None, MachineState(gas_limit=8000000)) |
||||
print(world_state.balances) |
||||
state.world_state.transaction_sequence = [ |
||||
MessageCallTransaction( |
||||
world_state=world_state, |
||||
gas_limit=8000000, |
||||
init_call_data=True, |
||||
call_value=symbol_factory.BitVecSym("call_value", 256), |
||||
caller=ACTORS.attacker, |
||||
callee_account=active_account, |
||||
) |
||||
] |
||||
state.transaction_stack.append( |
||||
( |
||||
MessageCallTransaction( |
||||
world_state=world_state, gas_limit=8000000, init_call_data=True |
||||
), |
||||
None, |
||||
) |
||||
) |
||||
print(state.world_state.transaction_sequence[0].call_data.calldatasize) |
||||
state.mstate.stack = [symbol_factory.BitVecSym("jump_dest", 256)] |
||||
|
||||
state.world_state.constraints = Constraints(constraints) |
||||
return state |
||||
|
||||
|
||||
test_data = ( |
||||
( |
||||
get_global_state([symbol_factory.BitVecSym("jump_dest", 256) == 222]), |
||||
True, |
||||
), |
||||
( |
||||
get_global_state([symbol_factory.BitVecSym("jump_dest", 256) > 222]), |
||||
False, |
||||
), |
||||
) |
||||
|
||||
|
||||
@pytest.mark.parametrize("global_state, unique", test_data) |
||||
def test_unique_jumpdest(global_state, unique): |
||||
time_handler.start_execution(10) |
||||
assert is_unique_jumpdest(global_state.mstate.stack[-1], global_state) == unique |
||||
|
||||
|
||||
test_data = ( |
||||
( |
||||
get_global_state([symbol_factory.BitVecSym("jump_dest", 256) == 222]), |
||||
False, |
||||
), |
||||
( |
||||
get_global_state([symbol_factory.BitVecSym("jump_dest", 256) > 222]), |
||||
True, |
||||
), |
||||
) |
||||
|
||||
|
||||
@pytest.mark.parametrize("global_state, has_issue", test_data) |
||||
def test_module(global_state, has_issue): |
||||
time_handler.start_execution(10) |
||||
module = ArbitraryJump() |
||||
assert (len(module._analyze_state(global_state)) > 0) == has_issue |
Loading…
Reference in new issue