破解以太坊 EVM 谜题7

通过以太坊EVM谜题深入学习EVM , 破解谜题 7

通过以太坊 EVM 谜题深入学习 EVM,了解 EVM 可以帮助我们写出更高效的代码。

学习Solidity 的同学,欢迎订阅我的另一个专栏Ethernaut 题库闯关, 了解常用的 Hacker 方法,可以帮助我们写出更安全的代码。

37&w=3840&q=75.png

EVM 谜题7

00      36        CALLDATASIZE
01      6000      PUSH1 00
03      80        DUP1
04      37        CALLDATACOPY
05      36        CALLDATASIZE
06      6000      PUSH1 00
08      6000      PUSH1 00
0A      F0        CREATE
0B      3B        EXTCODESIZE
0C      6001      PUSH1 01
0E      14        EQ
0F      6013      PUSH1 13
11      57        JUMPI
12      FD        REVERT
13      5B        JUMPDEST
14      00        STOP

以上是 EVM 谜题 7 的操作码,这个挑战引入了一些新的操作码和更多的复杂性。让我们回顾一下每一个新的操作码,并尝试把所有的内容分成几部分:

  • CALLDATACOPY: 从堆栈中弹出3个值作为输入,并从交易数据中复制calldata值到内存中。

    • 参数 1 destOffset: 内存中的字节偏移量,复制操作的结果将被复制到这里。
    • 参数 2 offset: 字节偏移量,你想从calldata中哪个位置开始复制。
    • 参数 3 size: 你想在内存中复制的calldata数据的字节大小
  • CREATE: 部署一个新的合约。它从堆栈中弹出3个值,作为部署操作的输入。该操作的结果是部署合约的地址(address), 它会被推到堆栈中的。

    • 参数 1 value: 发送给新账户的价值
    • 参数 2 offset: 字节偏移量,你想从内存中哪个位置开始复制新合约的代码。
    • 参数 3: size: 从内存偏移量开始复制的指令的字节大小
  • extcodesize: 从堆栈中弹出一个值,作为20字节的地址使用。这个地址将被用来作为参数 "查询"目标合约,并得到合约代码的字节大小作为结果。该结果被推回堆栈。

让我们试着理解所有这些操作码在执行时的作用。

第1部分:复制整个calldata输入到内存中


00      36        CALLDATASIZE
01      6000      PUSH1 00
03      80        DUP1
04      37        CALLDAT...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Ethernaut CTF
Ethernaut CTF
信奉 CODE IS LAW.