@ -177,7 +177,7 @@ class Instruction:
result = simplify ( Concat ( BitVecVal ( 0 , 248 ) , Extract ( offset + 7 , offset , op1 ) ) )
else :
result = 0
except Attribut eError:
except Typ eError:
logging . debug ( " BYTE: Unsupported symbolic byte offset " )
result = global_state . new_bitvec ( str ( simplify ( op1 ) ) + " [ " + str ( simplify ( op0 ) ) + " ] " , 256 )
@ -267,6 +267,8 @@ class Instruction:
try :
s0 = util . get_concrete_int ( s0 )
s1 = util . get_concrete_int ( s1 )
except TypeError :
return [ ]
if s0 < = 31 :
testbit = s0 * 8 + 7
@ -276,9 +278,6 @@ class Instruction:
state . stack . append ( s1 & ( ( 1 << testbit ) - 1 ) )
else :
state . stack . append ( s1 )
# TODO: broad exception handler
except :
return [ ]
return [ global_state ]
@ -358,7 +357,7 @@ class Instruction:
try :
offset = util . get_concrete_int ( simplify ( op0 ) )
b = environment . calldata [ offset ]
except Attribut eError:
except Typ eError:
logging . debug ( " CALLDATALOAD: Unsupported symbolic index " )
state . stack . append ( global_state . new_bitvec (
" calldata_ " + str ( environment . active_account . contract_name ) + " [ " + str ( simplify ( op0 ) ) + " ] " , 256 ) )
@ -370,16 +369,15 @@ class Instruction:
return [ global_state ]
if type ( b ) == int :
val = b ' '
try :
for i in range ( offset , offset + 32 ) :
val + = environment . calldata [ i ] . to_bytes ( 1 , byteorder = ' big ' )
val = b ' ' . join ( [ calldata . to_bytes ( 1 , byteorder = ' big ' ) for calldata in
environment . calldata [ offset : offset + 32 ] ] )
logging . debug ( " Final value: " + str ( int . from_bytes ( val , byteorder = ' big ' ) ) )
state . stack . append ( BitVecVal ( int . from_bytes ( val , byteorder = ' big ' ) , 256 ) )
# FIXME: broad exception catch
except :
except ( TypeError , AttributeError ) :
state . stack . append ( global_state . new_bitvec (
" calldata_ " + str ( environment . active_account . contract_name ) + " [ " + str ( simplify ( op0 ) ) + " ] " , 256 ) )
else :
@ -407,16 +405,14 @@ class Instruction:
try :
mstart = util . get_concrete_int ( op0 )
# FIXME: broad exception catch
except :
except TypeError :
logging . debug ( " Unsupported symbolic memory offset in CALLDATACOPY " )
return [ global_state ]
dstart_sym = False
try :
dstart = util . get_concrete_int ( op1 )
# FIXME: broad exception catch
except :
except TypeError :
logging . debug ( " Unsupported symbolic calldata offset in CALLDATACOPY " )
dstart = simplify ( op1 )
dstart_sym = True
@ -424,8 +420,7 @@ class Instruction:
size_sym = False
try :
size = util . get_concrete_int ( op2 )
# FIXME: broad exception catch
except :
except TypeError :
logging . debug ( " Unsupported symbolic size in CALLDATACOPY " )
size = simplify ( op2 )
size_sym = True
@ -440,8 +435,7 @@ class Instruction:
if size > 0 :
try :
state . mem_extend ( mstart , size )
# FIXME: broad exception catch
except :
except TypeError :
logging . debug ( " Memory allocation error: mstart = " + str ( mstart ) + " , size = " + str ( size ) )
state . mem_extend ( mstart , 1 )
state . memory [ mstart ] = global_state . new_bitvec (
@ -455,7 +449,7 @@ class Instruction:
for i in range ( mstart , mstart + size ) :
state . memory [ i ] = environment . calldata [ i_data ]
i_data + = 1
except :
except IndexError :
logging . debug ( " Exception copying calldata to memory " )
state . memory [ mstart ] = global_state . new_bitvec (
@ -510,8 +504,7 @@ class Instruction:
try :
index , length = util . get_concrete_int ( op0 ) , util . get_concrete_int ( op1 )
# FIXME: broad exception catch
except :
except TypeError :
# Can't access symbolic memory offsets
if is_expr ( op0 ) :
op0 = simplify ( op0 )
@ -523,7 +516,7 @@ class Instruction:
data = b ' ' . join ( [ util . get_concrete_int ( i ) . to_bytes ( 1 , byteorder = ' big ' )
for i in state . memory [ index : index + length ] ] )
except Attribut eError:
except Typ eError:
argument = str ( state . memory [ index ] ) . replace ( " " , " _ " )
result = BitVec ( " KECCAC[ {} ] " . format ( argument ) , 256 )
@ -548,14 +541,14 @@ class Instruction:
try :
concrete_memory_offset = helper . get_concrete_int ( memory_offset )
except Attribut eError:
except Typ eError:
logging . debug ( " Unsupported symbolic memory offset in CODECOPY " )
return [ global_state ]
try :
concrete_size = helper . get_concrete_int ( size )
global_state . mstate . mem_extend ( concrete_memory_offset , concrete_size )
except :
except TypeError :
# except both attribute error and Exception
global_state . mstate . mem_extend ( concrete_memory_offset , 1 )
global_state . mstate . memory [ concrete_memory_offset ] = \
@ -564,7 +557,7 @@ class Instruction:
try :
concrete_code_offset = helper . get_concrete_int ( code_offset )
except Attribut eError:
except Typ eError:
logging . debug ( " Unsupported symbolic code offset in CODECOPY " )
global_state . mstate . mem_extend ( concrete_memory_offset , concrete_size )
for i in range ( concrete_size ) :
@ -598,7 +591,7 @@ class Instruction:
environment = global_state . environment
try :
addr = hex ( helper . get_concrete_int ( addr ) )
except Attribut eError:
except Typ eError:
logging . info ( " unsupported symbolic address for EXTCODESIZE " )
state . stack . append ( global_state . new_bitvec ( " extcodesize_ " + str ( addr ) , 256 ) )
return [ global_state ]
@ -672,7 +665,7 @@ class Instruction:
try :
offset = util . get_concrete_int ( op0 )
except Attribut eError:
except Typ eError:
logging . debug ( " Can ' t MLOAD from symbolic index " )
data = global_state . new_bitvec ( " mem[ " + str ( simplify ( op0 ) ) + " ] " , 256 )
state . stack . append ( data )
@ -697,7 +690,7 @@ class Instruction:
try :
mstart = util . get_concrete_int ( op0 )
except Attribut eError:
except Typ eError:
logging . debug ( " MSTORE to symbolic index. Not supported " )
return [ global_state ]
@ -710,17 +703,15 @@ class Instruction:
try :
# Attempt to concretize value
_bytes = util . concrete_int_to_bytes ( value )
i = 0
state . memory [ mstart : mstart + len ( _bytes ) ] = _bytes
for b in _bytes :
state . memory [ mstart + i ] = _bytes [ i ]
i + = 1
except :
except ( AttributeError , TypeError ) :
try :
state . memory [ mstart ] = value
except :
except TypeError :
logging . debug ( " Invalid memory access " )
return [ global_state ]
@ -732,7 +723,7 @@ class Instruction:
try :
offset = util . get_concrete_int ( op0 )
except Attribut eError:
except Typ eError:
logging . debug ( " MSTORE to symbolic index. Not supported " )
return [ global_state ]
@ -753,7 +744,7 @@ class Instruction:
index = util . get_concrete_int ( index )
return self . _sload_helper ( global_state , index )
except Attribut eError:
except Typ eError:
if not keccak_function_manager . is_keccak ( index ) :
return self . _sload_helper ( global_state , str ( index ) )
@ -815,7 +806,7 @@ class Instruction:
try :
index = util . get_concrete_int ( index )
return self . _sstore_helper ( global_state , index , value )
except Attribut eError:
except Typ eError:
is_keccak = keccak_function_manager . is_keccak ( index )
if not is_keccak :
return self . _sstore_helper ( global_state , str ( index ) , value )
@ -869,7 +860,7 @@ class Instruction:
disassembly = global_state . environment . code
try :
jump_addr = util . get_concrete_int ( state . stack . pop ( ) )
except Attribut eError:
except Typ eError:
raise InvalidJumpDestination ( " Invalid jump argument (symbolic address) " )
except IndexError :
raise StackUnderflowException ( )
@ -899,8 +890,7 @@ class Instruction:
try :
jump_addr = util . get_concrete_int ( op0 )
# FIXME: to broad exception handler
except :
except TypeError :
logging . debug ( " Skipping JUMPI to invalid destination. " )
global_state . mstate . pc + = 1
return [ global_state ]
@ -980,7 +970,7 @@ class Instruction:
return_data = [ global_state . new_bitvec ( " return_data " , 256 ) ]
try :
return_data = state . memory [ util . get_concrete_int ( offset ) : util . get_concrete_int ( offset + length ) ]
except Attribut eError:
except Typ eError:
logging . debug ( " Return with symbolic length or offset. Not supported " )
global_state . current_transaction . end ( global_state , return_data )
@ -1013,7 +1003,7 @@ class Instruction:
return_data = [ global_state . new_bitvec ( " return_data " , 256 ) ]
try :
return_data = state . memory [ util . get_concrete_int ( offset ) : util . get_concrete_int ( offset + length ) ]
except Attribut eError:
except Typ eError:
logging . debug ( " Return with symbolic length or offset. Not supported " )
global_state . current_transaction . end ( global_state , return_data = return_data , revert = True )
@ -1057,7 +1047,7 @@ class Instruction:
try :
mem_out_start = helper . get_concrete_int ( memory_out_offset )
mem_out_sz = memory_out_size . as_long ( )
except Attribut eError:
except Typ eError:
logging . debug ( " CALL with symbolic start or offset not supported " )
return [ global_state ]
@ -1114,7 +1104,7 @@ class Instruction:
try :
memory_out_offset = util . get_concrete_int ( memory_out_offset ) if isinstance ( memory_out_offset , ExprRef ) else memory_out_offset
memory_out_size = util . get_concrete_int ( memory_out_size ) if isinstance ( memory_out_size , ExprRef ) else memory_out_size
except Attribut eError:
except Typ eError:
global_state . mstate . stack . append ( global_state . new_bitvec ( " retval_ " + str ( instr [ ' address ' ] ) , 256 ) )
return [ global_state ]
@ -1182,7 +1172,7 @@ class Instruction:
try :
memory_out_offset = util . get_concrete_int ( memory_out_offset ) if isinstance ( memory_out_offset , ExprRef ) else memory_out_offset
memory_out_size = util . get_concrete_int ( memory_out_size ) if isinstance ( memory_out_size , ExprRef ) else memory_out_size
except Attribut eError:
except Typ eError:
global_state . mstate . stack . append ( global_state . new_bitvec ( " retval_ " + str ( instr [ ' address ' ] ) , 256 ) )
return [ global_state ]
@ -1254,7 +1244,7 @@ class Instruction:
ExprRef ) else memory_out_offset
memory_out_size = util . get_concrete_int ( memory_out_size ) if isinstance ( memory_out_size ,
ExprRef ) else memory_out_size
except Attribut eError:
except Typ eError:
global_state . mstate . stack . append ( global_state . new_bitvec ( " retval_ " + str ( instr [ ' address ' ] ) , 256 ) )
return [ global_state ]