pragma solidity ^0.4.23;
contract Test {
mapping (address => uint) balances;
constructor() public {
balances[tx.origin] = 0;
}
event FLAG(string b64email, string slogan);
function getbalance() public constant returns (uint){
return balances[tx.origin];
}
function AddBalance(uint f) public {
if(f==1){
balances[tx.origin]++;
}
}
function CaptureTheFlag(string b64email) public{
require (balances[tx.origin]>0);
emit FLAG(b64email, "you will get flag!");
}
}
分析如下
pragma solidity ^0.4.23;
contract Test {
………………
}
mapping (address => uint) balances;
constructor() public {
balances[tx.origin] = 0;
}
event FLAG(string b64email, string slogan);
其中邮箱发送脚本编写建议参考博客https://www.cnblogs.com/KRDecad3/p/10798383.html
function getbalance() public constant returns (uint){
return balances[tx.origin];
}
function AddBalance(uint f) public {
if(f==1){
balances[tx.origin]++;
}
}
一般CTF中智能合约题目,都是当发送调用(或事务)的帐户的地址满足一定条件时,然后允许发送flag到指定邮箱。这边就是进行一个简单的为账户余额+1的方法,实现交互,传入f为1即可为余额+1。
function CaptureTheFlag(string b64email) public{
require (balances[tx.origin]>0);
emit FLAG(b64email, "you will get flag!");
}
编译成功后会显示绿色的勾表示编译成功,如果编译失败可以看编译详细,查看错误原因
Environment 选择Injected Web3
Account如果没有的话需要安装MetaMask钱包插件
如果已安装并且登陆的话,在选择Injected Web3时会自动请求连接到你的MetaMask钱包里的账号。
点击Deploy部署合约
在MetaMask钱包里面可以看到历史纪录中合约部署成功
合约地址可以在Remix IDE中的Deployed Contracts找到我们成功部署的合约,点击Copy就可以复制合约地址,地址为0x3eCC14397D0413e29b83653691d8614519eA3394。
查询合约地址详细信息的网址为 https://ropsten.etherscan.io/
可以通过该网址查到我们已部署的合约地址产生的记录,当前为部署合约时产生的记录。
在At Address中填入目的合约的地址,点击At Address加载合约
点击getbalance可以看到当前余额为0
调用AddBalance传入1后,等待合约交互成功,然后getbalance发现我们的余额已经实现+1了。
最后将我们的邮箱的base64编码后的值输入,调用合约中CaptureTheFlag方法,等待合约交互成功。
通过查合约地址记录,成功调用到发送flag的合约方法了。到邮箱中查最新的邮件即可。