CTF-BabyOtter

题目源代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

contract BabyOtter {
bool public solved = false;

function solve(uint x) public {
unchecked {
assert(x * 0x1337 == 1);
}
solved = true;
}
}

这个题,有个unchecked

它是一个不对溢出进行的一个检查unchecked 是一个特殊的关键字,表示在代码块中进行运算时不进行溢出检查。这意味着即使在某些情况下会发生溢出,也不会触发 Solidity 默认的溢出检查错误。

那么就很容易想到溢出来解决这个题了
攻击代码:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

interface IBabyOtter {
function solve(uint x) external;
}

contract Exploit {
function exploit() public {
uint number = 106517423012574869748253447278778772725360170890836257832597187972312850502279;
address target = 0x4e309C767Acc9f9366d75C186454ed205d5Eeee3;
IBabyOtter(target).solve(number);
}
}