讲一讲区块链逆向函数涉及到的接收参数的指令集

当你在逆向一个 EVM 字节码时,你会发现函数参数的传递和处理主要涉及到以下几种指令集和概念:

1. CALLDATALOADCALLDATASIZE

  • CALLDATALOAD: 这个指令用于从交易的调用数据(calldata)中加载参数。calldata 是一个只读的、外部调用的数据区域,它存储了函数选择器(Function Selector)和所有传入的参数。CALLDATALOAD 接收一个内存偏移量作为参数,然后从该偏移量处加载一个32字节(256位)的数据到栈顶
    • 逆向分析中的应用: 当你看到一个 CALLDATALOAD 指令时,你需要查看它加载的偏移量
      • 0x04 偏移量通常是第一个参数的开始。这是因为前4个字节(0x000x03)是函数选择器,用于识别要调用的函数
      • 随后的偏移量(例如 0x240x44 等)则对应后续的参数
  • CALLDATASIZE: 这个指令用于获取 calldata 的总大小。在逆向分析中,它通常用于进行边界检查,确保传入的参数数量和大小是正确的

2. ISZEROJUMPI

  • ISZERO: 这是一个判断指令,用于检查栈顶的值是否为零。在处理参数时,它通常用于检查某个参数是否为空或为0
  • JUMPI: 这是一个条件跳转指令。它接收两个参数:一个目标地址和一个条件。如果条件非零,程序执行流将跳转到目标地址
    • 逆向分析中的应用: 你会看到 ISZEROJUMPI 常常配合使用,用于函数签名检查。当函数签名(前4个字节)与预期的签名不匹配时,JUMPI 就会将程序跳转到错误处理代码块,如 revertinvalid jump。这是逆向分析中识别不同函数入口点的关键

3. EQ, LT, GT (比较指令)

  • EQ: 比较栈顶的两个值是否相等
  • LT: 比较栈顶的第一个值是否小于第二个值
  • GT: 比较栈顶的第一个值是否大于第二个值
    • 逆向分析中的应用: 这些比较指令经常用于对传入的参数进行验证,例如检查一个数值参数是否在某个范围内,或者一个地址参数是否等于合约所有者的地址

4. MSTOREMLOAD

虽然这两个指令不直接用于接收参数,但在处理和使用参数时它们是不可或缺的

  • MSTORE: 将栈顶的32字节数据存储到指定的内存(Memory)位置
  • MLOAD: 从指定的内存位置加载32字节数据到栈顶
    • 逆向分析中的应用: 传入的参数通常会先从 calldata 加载到栈上,然后使用 MSTORE 存储到内存中以供后续计算或处理。当你看到一个 MSTORE 指令时,它通常意味着一个参数正在被复制到内存中
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:12

results matching ""

    No results matching ""