錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
分析一個有趣的蜜罐合約

作者: 佚名  日期:2018-07-31 16:49:44   來源: 本站整理

 前言
前段時間看了有關智能合約里蜜罐合約的一些資料,感覺還是非常有意思的,這些蜜罐合約的利用點大都很巧妙,目的都是為了誘惑你往合約里送錢,而且目標人群也不是什么小白,恰恰是相關的技術人員反而容易著了他們的道。這里我也想起了早前見到的某個合約,現在再看確實也是個蜜罐合約,下面我們來看看它的利用點。
 
開端
說起來這份合約當時也是某位師傅分享給我,因為乍看起來問題很大,當時還在開玩笑要不要拿下它把錢轉出來合約的代碼很簡單,如下
pragma solidity ^0.4.20;
contract GUESS_IT
{
    function Play(string _response)
    external
    payable
    {
        require(msg.sender == tx.origin);
        if(responseHash == keccak256(_response) && msg.value>1 ether)
        {
            msg.sender.transfer(this.balance);
        }
    }
    string public question;
    address questionSender;
    bytes32 responseHash;
    function StartGame(string _question,string _response)
    public
    payable
    {
        if(responseHash==0x0)
        {
            responseHash = keccak256(_response);
            question = _question;
            questionSender = msg.sender;
        }
    }
    function StopGame()
    public
    payable
    {
       require(msg.sender==questionSender);
       msg.sender.transfer(this.balance);
    }
    function NewQuestion(string _question, bytes32 _responseHash)
    public
    payable
    {
        require(msg.sender==questionSender);
        question = _question;
        responseHash = _responseHash;
    }
    function() public payable{}
}
乍一看是不是問題多多,實際上也確實是問題多多,要成功地play game需要給出正確的response,經過sha3加密后與responseHash進行比較即可成功提取所有的eth,同時我們又發現在StartGame函數中response直接作為參數傳送進來了,我們知道鏈上的交易都是公開透明的,所以合約的創建者執行這一函數時我們是可以看到他傳遞的值的,所以我們直接去查看到response的值就可以成功play game了,當時這個合約里還存入了一個eth,相當于發送一個eth過去可以拿到兩個eth,想想還是挺刺激的,不過也只能是想想,真的發了你就得哭了
這個合約看起來其實看起來跟一個叫新年禮物的蜜罐合約有點像,404的團隊的文章里也有提到以太坊蜜罐智能合約分析,不過實際上利用點還是有些區別。
初看完這個合約,你可能會覺得這個作者是不是個小白,一點都不了解以太坊運行的機制就隨便在主鏈上創建了合約,而且還存入了一個以太幣,更是把源碼都發布上來讓你參觀,其實這時候你應該有點感覺到不對勁了,這天上難道還真能掉餡餅么,當時一個以太幣也不是個小數目了,不過怎么看也找不到問題所在,不管了,先動手試試再說。
 
嘗試
第一步我們當然要先確定response的值,前面也提到這個可以在調用startgame函數時查看,我們在etherscan上查看該合約的交易記錄

第一步創建了合約,那么下一步應該就是startgame了,我們查看該交易的內容

在這里我們可以直接選擇將交易的內容解碼,這樣就可以看到里面包含的這部分信息,所以respose的值就是A snowflakE了,看到這個是不是有點激動,說實話我當時也有點激動,不過現在還是得冷靜,后面一個交易是創建者往里面沖了一個ether,再下面竟然是一個老哥發了一個交易把eth給提出來了,不過我看的時候比較早,那時候還沒有這筆交易,其實這是合約主人把幣給提出來而已,現在看來應該是別人部署來測試的,再看這筆交易的內容

竟然真的是用的前面的response進行提幣的,難道這個合約真的可以利用么?其實這里就是創建者的惡趣味了,我們接著往下看。
 
深入
前面我們已經在交易里看到了response的值,我相信很多人可能已經蠢蠢欲動了,不過為了以防萬一我們還是多做點驗證工作
我們知道合約里使用storage存儲的變量都是可以在鏈上查到的,所以此處的responseHash是可以讀取的,那么我們可以用它來進行驗證,按照變量定義的順序,存儲位slot 0存放的是string變量question的長度,slot 1存放的是questionsender地址,slot 2存放的是responseHash,所以我們讀取slot 2里的值,然后與前面的response的sha3進行比較
這里因為這個蜜罐已經被廢棄了,所以值確實是一樣的,然而當時我進行嘗試的時候slot 2里存儲的并不是這串hash,當時我得到的是下面這串
0x490a2750bb759c739d4e8657ebad54ae2175d222146b95118e76f6c9a6f9bf6a
當時我真的是非常納悶,這咋就對不上號呢,我又看了其它變量存儲的位置

這question的長度倒還對得上號,但是這個sender的地址是怎么冒出來的,按道理不是應該是合約創建者的地址么,前面我們可以看到其地址如下
0xac413e7f9c2a5ed2fde919ce3d1e1e98f8d33a55
而存儲里的這串卻是個合約地址,這讓我很是頭疼,后來找到相關資料才知道玄機在于etherscan上可見交易的機制,在etherscan上對于合約與合約之間的消息傳送,當msg.value為0時它是不顯示的,因為它們被視為合約間的相互調用而不是一筆交易,但這部分的信息可以通過etherchain來查看,現在我們使用它來查看該合約間的調用信息

果然,現在交易信息就多了很多,我們發現在創建合約后的第一步行動并不是來自創建者,而是來自一個合約,而這正是我們前面讀取到的sender的地址,這下子就都說得通了,我們來看看這個合約在這次調用里都干了些啥,進入以后我們點擊Parity Trace來追蹤這兩次調用的信息,于是得到了這兩部分inputdata

因為這里不像etherscan那樣自帶decode,所以需要我們手動進行解碼,這里我們可以使用abi-decoder工具,這個可以用node.js部署,不過簡單點我們直接把abi-decoder.js下載下來就行了,然后我們直接在瀏覽器里使用
首先導入abi,可以直接在etherscan的源碼部分復制,然后將inputdata放入進行解碼即可
const abi =[{"constant":false,"inputs":[{"name":"_question","type":"string"},{"name":"_response","type":"string"}],"name":"StartGame","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_question","type":"string"},{"name":"_responseHash","type":"bytes32"}],"name":"NewQuestion","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"question","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_response","type":"string"}],"name":"Play","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"StopGame","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"}];
abiDecoder.addABI(abi);
const input1='0x1f1c827f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004f5768617420666c696573207768656e206974e280997320626f726e2c206c696573207768656e206974e280997320616c6976652c20616e642072756e73207768656e206974e280997320646561643f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003735a730000000000000000000000000000000000000000000000000000000000';
const input2='0x3e3ee8590000000000000000000000000000000000000000000000000000000000000040490a2750bb759c739d4e8657ebad54ae2175d222146b95118e76f6c9a6f9bf6a000000000000000000000000000000000000000000000000000000000000004f5768617420666c696573207768656e206974e280997320626f726e2c206c696573207768656e206974e280997320616c6976652c20616e642072756e73207768656e206974e280997320646561643f0000000000000000000000000000000000';
結果如下

果然玄機就在這里,真正的responsehash是在這里設置的,該合約首先調用startgame來使自己成為questionSender,然后再設置全新的resonseHash,這里的response也不過是瞎寫的,真是很狡詐啊,至于后面的那幾個調用感覺就是創建者的惡趣味了,在接下來的幾個調用里就是拿他的地址假裝調用startgame設置了response值,然而事實上這里responseHash已經不為0,所以是沒有響應的,然后就等你上鉤了,然后他又使用前面已經成為questionSender的合約將responseHash的值改為了我們在etherscan上交易里看到的response的hash值,接下來他便使用另一錢包發送1 ether來提取合約內的ether,正常來講這里是多次一舉的,因為他直接調用stopgame就可以拿回錢了,而他還費gas取改responseHash,大概是想偽造出一種有人成功拿錢走人的錯覺吧。
 
結語
希望這次的分析能讓大家感受到蜜罐合約的趣味性,對于那些對以太坊有一定了解手上又有點幣的人來說就得小心了,講道理第一次見的話是很容易被忽悠到的,畢竟以太坊上神奇的機制這么多,稍不小心可能就會栽了跟頭,最好是時刻牢記天上是不會掉餡餅的。



熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    主站蜘蛛池模板: 亚洲?V无码成人精品区日韩 | 免费看无码自慰一区二区| 人妻丰满熟妇AV无码区乱| 亚洲乱亚洲乱妇无码| 亚洲Av无码专区国产乱码DVD| 亚洲AV无码男人的天堂| 亚洲av无码不卡久久| 无码一区二区三区视频| 日韩精品无码视频一区二区蜜桃| 无码人妻一区二区三区兔费| 国产日产欧洲无码视频| 一本大道无码日韩精品影视| 无码精品久久久天天影视 | 成人免费无码大片a毛片| 久久青青草原亚洲AV无码麻豆| 人妻av中文字幕无码专区| 无码人妻一区二区三区av| 欧洲Av无码放荡人妇网站 | 色爱无码AV综合区| 亚洲日韩av无码| 久久久久无码精品亚洲日韩| 国产av激情无码久久| 无码一区18禁3D| 中文字幕无码视频手机免费看| MM1313亚洲精品无码久久| 精品久久久久久无码专区| 日韩精品人妻系列无码专区| 久久精品无码一区二区三区| 亚洲精品97久久中文字幕无码 | 国产精品午夜无码体验区| 亚洲乱亚洲乱妇无码| 无码无套少妇毛多18PXXXX| 无码孕妇孕交在线观看| 91久久精品无码一区二区毛片| 亚洲AV无码国产在丝袜线观看| 亚洲啪啪AV无码片| 无码孕妇孕交在线观看| 无码精品尤物一区二区三区| 久久水蜜桃亚洲av无码精品麻豆| 无码AV中文字幕久久专区| 人妻精品久久无码专区精东影业|