NewStarCTF Week3 Blockchain
前言:最近学了点blockchain,正好NewStarCTF这周上了题,赶紧来练练手,出题人很友好,代码都很简单,适合刚了解区块链的新手入门
Checkin
先安装Metamask,再去Goerli水龙头领币
然后nc连接124.221.212.109 10000
首先选择选项一,服务器会发给我们一个账户地址和token,按要求向账户转0.001eth
用Metamask向该地址转账即可
转账完成后选择选项二,输入一中的token进行部署合约,拿到交易地址,在etherscan中查找对应的交易,即可找到交易哈希对应的生成合约的地址
之后选择选项四查看合约代码,把代码copy到remix中
简单审计之后可以发现只需greeting==key即可,我们令_greeting='HelloNewstarCTF',然后通过setGreeting函数让greeting等于_greeting就可以解决问题
接下来先在左侧的Solidity compiler中编译checkin.sol
Meta mask连接好remix之后在at address处输入上面的交易地址,点击at address连接到对应链上,然后在_greeting上输入HelloNewstarCTF并transact即可
与合约交互完成之后,就可以拿到flag了
flag{Ea2y_B1ockChain_Ch3ckin}
同时在etherscan上能看到合约的事件被触发了,可以看到我们发送的消息
Guess Number
选项二查看源码
简单审计下代码不难发现,想要触发isSolve(),需要让guess_number=number
由于题目给的是一个固定的地址,可以看到之前有人在合约上进行交互了,这些Method为Guess的就是其他人发送的包含_greeting的msg
查看其中一个交互成功,且存在Logs项的交易(存在这一项说明这笔交易触发了事件)
通过查看这个交易的input数据并解码,就可以得到我们需要的number了,guess_number=7810111911511697114678470
发送guess_number,交易完成后在etherscan上就可以看到本次交易的tx hash,提交tx hash即可得到flag,flag{Wh4t_1s_th3_numb3r}
The Chosen One
这题部署合约的步骤与第一题类似,不再赘述
通过审计代码可以发现,想要触发isSolve(),需要调用getflag()函数,而只有owner才有权限调用getflag()函数,所以我们的目标是成为owner
function chooseone() public{
require(uint(msg.sender) & 0xffff==0xabcd);
owner = msg.sender;
}
这时我们可以注意到chooseone()函数中有一句
owner = msg.sender;
即让owner为信息发送者,它的条件是uint(msg.sender) & 0xffff==0xabcd
其意思是需要msg.sender的地址后四位为abcd,所以我们要做的就是创建一个地址后四位为abcd的账户,然后用该账户进行交互即可用
但是以太坊账户地址的生成是基于Hash算法的,具有随机性,我们要怎么得到末四位指定的地址呢?
通过Google,发现一个网站https://vanity-eth.tk/,这个网站可以帮助我们获得指定前缀或者后缀的以太地址账号
指定后四位为abcd,一段时间后得到符合要求的地址,通过私钥导入Metamask
然后把remix上的账户改成新建的账户,先进行chooseone,待交易完成后getflag即可
最后输入之前生成的token和交易的tx hash,得到flag flag{Y0u_ar3_th3_ch00s3n_0n3}