0%

区块链安全入门#2

Ethernaut靶场

level4

关键知识点:tx.originmsg.sender的区别

tx.origin vs msg.sender[¶](https://ctf-wiki.org/blockchain/ethereum/basics/#txorigin-vs-msgsender)

  • 这里区分一下 tx.origin 和 msg.sender ,msg.sender 是函数的直接调用方,在用户手动调用该函数时是发起交易的账户地址,但也可以是调用该函数的一个智能合约的地址。而 tx.origin 则必然是这个交易的原始发起方,无论中间有多少次合约内 / 跨合约函数调用,而且一定是账户地址而不是合约地址。
  • 给定这样一个场景如:用户通过合约 A 调合约 B,此时:
    • 对于合约 A : tx.origin 和 msg.sender 都是用户
    • 对于合约 B : tx.origin 是用户,msg.sender 是合约 A

——CTF-WIKI

POC

1
2
3
4
5
6
contract attack{
Telephone pubclic target = Telephone('账户地址');
function pwn() public{
target.changeOwner(msg.sender);
}
}

level5

**关键知识点:**溢出攻击

POC

版本0.6,存在下界溢出且无溢出保护,直接转21使得banlances=-1即可

level6

**关键知识点:**委托调用

委托调用就相当于把另一个函数的的代码照抄照搬过来然后调用

POC

msg.data填为pwn函数地址即可

level7

**关键知识点:**自毁合约——selfdestruct

POC

1
2
3
4
5
contract attack{
function pwn(address _target) payable public {
selfdestruct(payable(_target));
}
}

level8

关键知识点:区块链特性——记录公开透明

POC

翻转账记录,因为在区块链浏览器上所有数据都是公开透明的

重入攻击

我对重入攻击的理解是回调函数中断条件一直不被满足而导致的函数重复不断的调用

CTF-WIKI上的解释:

Re-Entrancy - CTF Wiki