题目来源于SICTF2024 #Round 3 Blockchain方向的CheckinNewYear
当时这题没做出来,现在根据official writeup进行了一次复盘(
题目
如何注册使用metamask这里不再赘述,remix IDE网站:https://remix.ethereum.org/
先生成一个deployer account:

按照要求给这个账户去水龙头接点水,不然就会无法支付2中部署合约时产生的费用

部署一下题目的智能合约,得到合约地址和token

用4查看一下合约的源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| // SPDX-License-Identifier: shu shao de xiao mi di pragma solidity ^0.8.9; contract HappyNewYear{ string private NewYear; constructor(string memory _newyear ) { NewYear = _newyear; } function happyNewYear(string memory _newYear) public payable { require(uint160(msg.sender) | 2**16 * 3**3 * 5 * 7 * 13 * 17 * 19 * 37 * 73 * 97 * 109 * 241 * 257 * 433 * 577 * 673 * 38737 * 487824887233 == 2**2 * 17 * 67 * 733 * 316139 * 18992431891 * 72887484710091183279372959 ,"Not this Year"); NewYear = _newYear; }
function isSolved() public view returns (bool){ require(keccak256(abi.encodePacked(NewYear)) == keccak256(abi.encodePacked("Happy")),"not HappyNewYear"); return true; }
}
|
阅读一下代码逻辑,发现其中对用户的地址有限制。这里用两串较长的式子进行了简单的混淆,经过计算不难发现,这里的限制是要求用户地址的最后四位是2024。
在这里,official writeup中给出了一个可以专门用来生成指定形式地址的网站:https://vanity-eth.tk/
比赛期间做的时候就是卡在这里了,学长发了我exp.sol我都不会用。。。没想到其实有这么方便的网站~(T0T)

接下来只要给isSolved函数的NewYear值传一个”Happy”字符串就可以了
python编写exp
官方给出的exp.py:
1 2 3 4 5 6 7 8 9 10 11 12 13
| from cheb3 import Connection from cheb3.utils import compile_file entrant_abi, entrant_bytecode = compile_file("Example.sol", "HappyNewYear", "0.8.9")['HappyNewYear'] conn = Connection('http://124.221.86.119:40002') existing_account =conn.account("...") target_address = "0x3C58Ec40D7E79BEf9c7987b7c5414b0B13CcEDEe" entrant_contract = conn.contract( existing_account, address=target_address, abi=entrant_abi ) entrant_contract.functions.happyNewYear("Happy").send_transaction()
|
成功运行以后只要去nc的3中查看即可

remix
新进一个test.sol文件,把得到的合约源码复制进去

编译一下,注意compiler的版本,绿色的√出现即为编译成功

在metamask上手动添加网络,网络名称随便写,RPC题目中的复制过来(记得加上http),链ID随便写,保存的时候它会教你做事,货币符号随便写
由于之前做题的时候添加过了,这里有个报错
在添加账户中导入账户,填写上面生成的账户的Private Key
开始将智能合约部署上链,ENVIRONMENT选Inject Provider - MetaMask,确保自己连入的是那个2024结尾的账户(点那个地球的标志查看),At Address填入合约地址,然后点一下At Address,给happyNewYear传一个Happy,然后点一下happyNewYear,确认交易,大功告成!

nc一下查看3即可看到flag
