当前位置:   article > 正文

不一样的智能合约安全视角——solidity逆向_solidity 合约逆向

solidity 合约逆向

前言

近年来在区块链不断蓬勃、发展壮大的同时,区块链安全事件频频发生,黑客们的手法也在不断发生着变化,要想更加深入的了解各式各样的攻击背后的原理以及黑客攻击的逻辑,智能合约逆向工程必不可少。

对此,知道创宇区块链安全实验室 进行了研究分析。

在这里插入图片描述

通常我们所说的智能合约都是存在区块链上,可以被触发执行的一段程序代码,由于区块链上所有的数据都是公开透明的,所以合约的代码也应该是公开的。

但实际上它公开的却是经过编译的 OPCODE,真正的源代码需要发布合约的人自己公开。当合约源代码没有被公开,而我们又想对其进行深刻的了解时,可以借助工具将OPCODE逆向成类似于逻辑代码的伪代码和字节码来辅助。

本篇文章主要涉及由 solidity 语言编写的智能合约逆向之伪代码分析。

安全事件逆向分析

为贴切现实,也便于理解,本文选择测试网络进行一次重入漏洞攻击复现的逆向分析,重入漏洞原理具体可参考文章【知道创宇区块链安全实验室|深入理解重入攻击漏洞】。

0x01 信息收集

漏洞合约 地址

https://ropsten.etherscan.io/address/0x8872be6d31f2ec0169e5e3e69e5cae8823d358af

漏洞合约 源码

// SPDX-License-Identifier: MIT
pragma solidity ^0.4.17;
contract EtherStore{
   uint256 public withdrawaLimit = 1 ether;
   mapping(address => uint256) public lastWithdrawTime;
   mapping(address => uint256) public balances;
   function depositFunds() public payable {
   balances[msg.sender] += msg.value;
}

function withdrawFunds (uint256 _weiToWithdraw) public {// 该函数存在重入漏洞,具体原因是使用call函数转账,且call函数转账发生在合约状态更新之前
    require(balances[msg.sender] >= _weiToWithdraw);
    require(_weiToWithdraw <= withdrawaLimit);
    require(now >= lastWithdrawTime[msg.sender] + 1 weeks);
    require(msg.sender.call.value(_weiToWithdraw)());
    balances[msg.sender] -= _weiToWithdraw;
    lastWithdrawTime[msg.sender] = now;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

}

通过查看漏洞合约内部交易哈希 发现

可疑地址 0x2409fE8CCabe32F7AEbA8b34DA111A990b5A3E40

交易哈希 0x80270b685344fc5005f4969ef6bd545a614cd6e2fc92b9508cfed5266368062f
在这里插入图片描述

查看交易哈希发现可疑地址在向漏洞合约发送 1eth 后,收到来自漏洞合约的转账 1eth 足足 5 次在这里插入图片描述

查看攻击合约地址 0x2409fE8CCabe32F7AEbA8b34DA111A990b5A3E40 发现该地址值调用过两个函数

结合 交易哈希 1eth 特征可以判断攻击合约就是通过 0x6289d385 函数发起进攻的,Collect Ether 函数应该是取款功能

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/654163
推荐阅读
相关标签
  

闽ICP备14008679号