mirror of https://github.com/ConsenSys/mythril
blockchainethereumsmart-contractssoliditysecurityprogram-analysissecurity-analysissymbolic-execution
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.1 KiB
112 lines
3.1 KiB
pragma solidity 0.5.0;
|
|
|
|
|
|
contract Caller {
|
|
|
|
//Just some useless variables
|
|
address public fixedAddress;
|
|
address public storedAddress;
|
|
|
|
//useless (but good for testing as they contribute as decoys)
|
|
uint256 private statevar;
|
|
bytes32 private far;
|
|
|
|
constructor (address addr) public {
|
|
fixedAddress = addr;
|
|
}
|
|
/*
|
|
// Commented out because this causes laser to enter an infinite loop... :/
|
|
// It sets the free memory pointer to a symbolic value, and things break
|
|
|
|
//some typical function as a decoy
|
|
function thisisfine() public {
|
|
(bool success, bytes memory mem) = fixedAddress.call("");
|
|
}
|
|
*/
|
|
|
|
function sha256Test1() public returns (uint256) {
|
|
uint256 i;
|
|
if (sha256(abi.encodePacked("ab", "c")) == sha256("abc")) {
|
|
// True
|
|
i = 5555555555555555;
|
|
} else {
|
|
// False
|
|
i = 323232325445454546;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function sha256Test2() public returns (uint256) {
|
|
uint256 i;
|
|
if (sha256("abd") == sha256(abi.encodePacked("ab", "d"))) {
|
|
// True
|
|
i = 34756834765834658;
|
|
} else {
|
|
// False
|
|
i = 8756476956956795876987;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function ripemdTest() public returns (uint256) {
|
|
uint256 i;
|
|
bytes20 v1 = ripemd160("");
|
|
bytes20 v2 = ripemd160("hhhhh");
|
|
|
|
if (v1 != v2) {
|
|
// True
|
|
i = 999999999999999999993;
|
|
} else {
|
|
// False
|
|
i = 1111111111112;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
function ecrecoverTest() public returns (uint256) {
|
|
bytes32 foobar1 = 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8;
|
|
bytes32 foobar2 = 0x38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e;
|
|
uint8 v = 28;
|
|
bytes32 r = 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608;
|
|
bytes32 s = 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada;
|
|
uint256 i;
|
|
address addr1 = ecrecover(keccak256(abi.encodePacked(foobar1)), v, r, s);
|
|
address addr2 = ecrecover(keccak256(abi.encodePacked(foobar1, foobar2)), v, r, s);
|
|
if (addr1 != addr2) {
|
|
// True
|
|
i = 674837568743979857398564869;
|
|
} else {
|
|
// False
|
|
i = 3487683476979311;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
//identity is invoked here in compiler and not below
|
|
function needIdentityInvoke(uint sea) public returns (uint) {
|
|
return sea;
|
|
}
|
|
|
|
function identityFunction(int input) public returns(int out) {
|
|
assembly {
|
|
let x := mload(0x40)
|
|
mstore(x, input)
|
|
|
|
let success := call(500000000, 0x4, 100000, x, 0x20, x, 0x20)
|
|
out := mload(x)
|
|
mstore(0x40, x)
|
|
}
|
|
}
|
|
|
|
function identityTest1() public returns (uint256) {
|
|
uint256 i;
|
|
if (identityFunction(100) == 100) {
|
|
// True
|
|
i = 87426857369875698;
|
|
} else {
|
|
// False
|
|
i = 476934798798347;
|
|
}
|
|
return i;
|
|
}
|
|
}
|
|
|