赞
踩
近年来在区块链不断蓬勃、发展壮大的同时,区块链安全事件频频发生,黑客们的手法也在不断发生着变化,要想更加深入的了解各式各样的攻击背后的原理以及黑客攻击的逻辑,智能合约逆向工程必不可少。
对此,知道创宇区块链安全实验室 进行了研究分析。
通常我们所说的智能合约都是存在区块链上,可以被触发执行的一段程序代码,由于区块链上所有的数据都是公开透明的,所以合约的代码也应该是公开的。
但实际上它公开的却是经过编译的 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; }
}
通过查看漏洞合约内部交易哈希 发现
可疑地址 0x2409fE8CCabe32F7AEbA8b34DA111A990b5A3E40
与
交易哈希 0x80270b685344fc5005f4969ef6bd545a614cd6e2fc92b9508cfed5266368062f
查看交易哈希发现可疑地址在向漏洞合约发送 1eth 后,收到来自漏洞合约的转账 1eth 足足 5 次
查看攻击合约地址 0x2409fE8CCabe32F7AEbA8b34DA111A990b5A3E40 发现该地址值调用过两个函数
结合 交易哈希 1eth 特征可以判断攻击合约就是通过 0x6289d385 函数发起进攻的,Collect Ether 函数应该是取款功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。