题目来源于SICTF2024 #Round 3 Blockchain方向的CheckinNewYear

当时这题没做出来,现在根据official writeup进行了一次复盘(

题目

屏幕截图 2024-02-22 235215

如何注册使用metamask这里不再赘述,remix IDE网站:https://remix.ethereum.org/

先生成一个deployer account:

image-20240223012955732

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

image-20240223013024832

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

image-20240223013113909

用4查看一下合约的源代码

屏幕截图 2024-02-23 004703
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)

image-20240223183457544

接下来只要给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'] #确保Example.sol跟这个py文件在同一路径下
conn = Connection('http://124.221.86.119:40002')
existing_account =conn.account("...") #这里是填写上面生成的账号的Private Key
target_address = "0x3C58Ec40D7E79BEf9c7987b7c5414b0B13CcEDEe" #合约地址
entrant_contract = conn.contract(
existing_account,
address=target_address,
abi=entrant_abi
)
entrant_contract.functions.happyNewYear("Happy").send_transaction()

成功运行以后只要去nc的3中查看即可

image-20240223010429906

remix

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

image-20240223010958373

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

image-20240223011101264

在metamask上手动添加网络,网络名称随便写,RPC题目中的复制过来(记得加上http),链ID随便写,保存的时候它会教你做事,货币符号随便写

由于之前做题的时候添加过了,这里有个报错

image-20240223011626597

在添加账户中导入账户,填写上面生成的账户的Private Key

image-20240223011806125

开始将智能合约部署上链,ENVIRONMENT选Inject Provider - MetaMask,确保自己连入的是那个2024结尾的账户(点那个地球的标志查看),At Address填入合约地址,然后点一下At Address,给happyNewYear传一个Happy,然后点一下happyNewYear,确认交易,大功告成!

image-20240223012042008

image-20240223012345867

image-20240223012407277

nc一下查看3即可看到flag

image-20240223010429906