CTF Wiki
  • 简介
  • 如何使用 CTF Wiki
  • introduction
    • CTF 历史
    • CTF 竞赛模式简介
    • CTF 竞赛内容
    • 线下攻防经验小结
    • CGC 超级挑战赛
    • 学习资源
  • misc
    • 杂项简介
    • 取证隐写前置技术
    • 信息搜集技术
    • encode
      • 通信领域常用编码
      • 计算机相关的编码
      • 现实世界中常用的编码
    • picture
      • 图片分析简介
      • JPG
      • PNG
      • GIF
    • audio
      • 音频隐写
    • archive
      • RAR 格式
      • ZIP 格式
    • traffic
      • 流量包分析简介
      • 协议分析概述
        • Wireshark
        • DNS
        • HTTP
        • HTTPS
        • FTP
        • USB
        • WIFI
      • 数据提取
      • PCAP 文件修复
    • disk-memory
      • 磁盘内存分析
      • 题目
    • shellcode
    • other
      • pyc
  • web
    • Web 简介
    • XSS
    • php
      • PHP 代码审计
    • SQL 注入
      • sqlmap绕过脚本
      • 各版本数据库语句备忘
    • CSRF
    • SSRF
  • reverse
    • 软件逆向工程简介
    • identify-encode-encryption
      • 常见加密算法和编码识别
    • language
      • 简介
      • go
        • Golang 逆向入门
      • python
        • Python 逆向入门
      • rust
        • Rust 逆向入门
    • maze
      • 迷宫问题
    • obfuscate
      • 控制流平坦化
      • 花指令
      • movofuscator
      • Self-Modified Code
    • vm
      • 虚拟机分析
    • platform
      • linux
        • Detecting Breakpoints
        • Detecting debugging
        • False Disassembly
        • LD_PRELOAD
      • windows
        • anti-debug
          • CheckRemoteDebuggerPresent
          • 反调试技术例题
          • Heap Flags
          • Interrupt 3
          • IsDebuggerPresent
          • 花指令
          • NtGlobalFlag
          • NtQueryInformationProcess
          • The Heap
          • Thread Local Storage(TLS)
          • ZwSetInformationThread
        • unpack
          • 一步到达 OEP 法
          • ESP 定律法
          • DUMP 及 IAT 重建
          • 最后一次异常法
          • 手动查找 IAT 并使用 ImportREC 重建
          • 内存镜像法
          • 保护壳简介
          • SFX 法
          • 单步跟踪法
          • DLL 文件脱壳
    • tools
      • constraint
        • z3
      • debug
        • gdb
        • ollydbg
        • windbg
        • x64dbg/x32dbg
      • simulate-execution
        • angr
        • Unicorn Engine
      • static-analyze
        • dnspy
        • Ghidra
        • IDA Pro
        • jadx
  • crypto
    • 密码学简介
    • asymmetric
      • 介绍
      • discrete-log
        • 离散对数
        • ECC
        • ElGamal
      • knapsack
        • 背包加密
      • lattice
        • CVP
        • 基本介绍
        • 格基规约算法
        • 格概述
      • rsa
        • RSA 选择明密文攻击
        • RSA 复杂题目
        • Coppersmith 相关攻击
        • 公钥指数相关攻击
        • 模数相关攻击
        • Bleichenbacher's attack
        • RSA 侧信道攻击
        • RSA 介绍
        • d_attacks
          • 私钥 d 相关攻击
          • 扩展维纳攻击
    • attack-summary
      • 简介
      • 比特攻击
      • 中间相遇攻击 - MITM
    • basic
      • 基础数学知识
    • blockcipher
      • AES
      • ARX: Add-Rotate-Xor
      • DES
      • IDEA
      • 块加密
      • Simon and Speck Block Ciphers
      • mode
        • CBC
        • CFB
        • CTR
        • ECB
        • 分组模式
        • OFB
        • Padding Oracle Attack
        • 填充方式
        • PCBC
    • certificate
      • 证书格式
    • classical
      • 古典密码简介
      • 单表代换加密
      • 其它类型加密
      • 多表代换加密
      • 总结
    • hash
      • Hash Attack
      • 综合题目
      • Fowler–Noll–Vo hash function
      • 哈希函数
      • MD5
      • SHA1
    • signature
      • DSA
      • ElGamal
      • 数字签名
      • RSA 数字签名
    • streamcipher
      • 流密码
      • fsr
        • 反馈移位寄存器
        • 线性反馈移位寄存器 - LFSR
        • 非线性反馈移位寄存器
      • lcg
        • 题目
        • 线性同余生成器
      • prng
        • 密码安全伪随机数生成器
        • 伪随机数生成器介绍
        • 题目
      • special
        • RC4
  • pwn
    • MacOS
    • misc-os
    • 概述
      • stackoverflow
        • 执行 Shellcode
        • 栈介绍
        • 栈溢出原理
    • browser
      • Chrome
      • Firefox
      • Safari
    • hardware
      • 简介
        • side-channel
          • prefetch side-channel attack
      • trusted-computing
        • 可信执行环境
    • linux
      • kernel-mode
        • 基础知识
        • Introduction
          • DoS
          • Information Disclosure
          • Introduction
            • Change Others
            • Change Self
        • Introduction
          • Introduction
            • 信息泄漏
            • Misc
          • Introduction
            • Kernel Stack Canary
          • Introduction
            • inner-kernel
              • 内部隔离
            • Introduction
              • KPTI - Kernel Page Table Isolation
              • 用户代码不可执行
              • 用户数据不可访问
          • Introduction
            • FGKASLR
            • KASLR
        • Introduction
          • 编译内核驱动
          • 内核下载与编译
          • Qemu 模拟环境
          • Real Device
        • exploitation
          • heap
            • 内核堆概述
            • buddy
              • Cross-Cache Overflow & Page-level Heap Fengshui
              • Page-level UAF
            • slub
              • freelist 劫持
              • Heap Spray
              • kernel UAF
          • race
            • Double Fetch
            • userfaultfd 的使用
          • rop
            • bypass-smep
            • ret2dir
            • 利用 pt_regs 构造通用内核 ROP
            • ret2usr(已过时)
            • Kernel ROP
          • tricks
            • 在内存中直接搜索 flag
      • user-mode
        • environment
        • fmtstr
          • 检测
          • 例子
          • 利用
          • 原理介绍
        • integeroverflow
          • 整数溢出
        • io-file
          • glibc 2.24下 IO_FILE 的利用
          • 伪造vtable劫持程序流程
          • FSOP
          • FILE结构
        • mitigation
          • Canary
        • race-condition
          • introduction
          • 题目
        • summary
          • 获取地址
          • shell 获取小结
          • 控制程序执行流
        • Type Confusion
        • Uninitialized Memory
        • heap
          • mallocng
          • ptmalloc2
            • Chunk Extend and Overlapping
            • Fastbin Attack
            • 堆概述
            • 堆相关数据结构
            • 堆溢出
            • House Of Einherjar
            • House Of Force
            • House of Lore
            • House of Orange
            • House of Pig
            • House of Rabbit
            • House of Roman
            • 堆利用
            • Large Bin Attack
            • 通过堆进行信息泄漏
            • 堆中的 Off-By-One
            • 堆中的检查
            • tcache makes heap exploitation easy again
            • Unlink
            • Unsorted Bin Attack
            • Use After Free
            • implementation
              • 基础操作
              • 释放内存块
              • 堆初始化
              • malloc_state 相关函数
              • 申请内存块
              • 测试支持
              • 深入理解堆的实现
              • tcache
        • stackoverflow
          • arm
            • 环境搭建
            • Arm ROP
          • mips
            • mips - ROP
          • RISC-V
          • x86
            • 基本 ROP
            • 花式栈溢出技巧
            • 中级ROP
            • 栈介绍
            • 栈溢出原理
            • advanced-rop
              • 高级 ROP
              • ret2dlresolve
              • ret2VDSO
              • SROP
    • sandbox
      • Chroot
      • Docker
      • Namespace
      • python
        • Python 沙盒
      • seccomp
        • C 沙盒逃逸
      • Shell Sandbox
    • virtualization
      • basic-knowledge
        • 虚拟化技术简介
        • CPU 虚拟化
        • IO 虚拟化
        • 内存虚拟化
      • parallels
        • Parallels
      • VirtualBox
      • VMWare
      • qemu
        • basic-knowledge
          • QEMU 设备模拟
          • QEMU 内存管理
        • environment
          • 编写 QEMU 模拟设备
          • QEMU 下载与编译
        • exploitation
          • QEMU 逃逸入门
          • 越界读写
  • Android 安全
    • basic_develop
      • Android 开发基础
    • Android 应用运行机制简述
      • Android 中 Java 层的运行机制
        • dex
          • DEX文件
          • ODEX文件
        • smali
          • Smali
      • native_layer
        • so 介绍
    • basic_reverse
      • Android 关键代码定位
      • Android 逆向基本介绍
      • dynamic
        • Android 动态调试
        • IDA 动态调试原生层程序
        • IDA 动态调试 smali 代码
      • static
        • 静态分析综合题目
        • 静态分析 java 层例子
        • 静态分析原生层程序
  • blockchain
    • Blockchain Security Challenges
    • Blockchain Security Overview
    • ethereum
      • Ethereum Basics
      • Ethereum Overview
      • Ethereum Opcodes
      • 学习资源
      • Smart Contract Reverse
      • Function Selector and Argument Encoding
      • Ethereum Storage
      • attacks
        • Airdrop Hunting
        • Arbitrary Writing
        • CREATE2
        • Delegatecall
        • Introduction
        • Jump Oriented Programming
        • Integer Overflow and Underflow
        • Randomness
        • Re-Entrancy
        • Short Address Attack
        • Uninitialized Storage Pointer
    • publicblockchain
      • Public Blockchain Security Overview
      • Blockchain Weaknesses
  • assembly
    • ARM
    • MIPS
    • x86_x64
  • executable
    • elf
      • 程序加载
      • 程序执行流程
      • linking
        • 程序链接
        • Symbol Reslove
      • structure
        • ELF 文件
        • Code Section
        • Data Related Sections
        • Dynamic Sections
        • Misc Sections
        • Sections
        • String Sections
        • .symtab: Symbol Table
    • pe
      • PE 文件格式
      • 导出表
      • 导入表
      • 基址重定位表
  • ics
    • ICS_CTF 竞赛
    • ICS_CTF 发现
    • ICS_CTF 利用
    • ICS_CTF 学习资源
  • contribute
    • 贡献之前
    • 基本贡献方式
    • 贡献文档要求
    • 翻译
  • write up
    • 浙江工业大学CTF赛事
      • 2023第四届“安恒杯”CTF新生赛题解
Powered by GitBook
On this page
  • Solidity
  • MetaMask
  • Remix
  • 账户
  • 外部账户
  • 合约账户
  • 交易
  • 交易费用
  • 交易内容
  • Interact with Contracts
  • tx.origin vs msg.sender
  1. blockchain
  2. ethereum

Ethereum Basics

PreviousethereumNextEthereum Overview

Last updated 1 year ago

对智能合约一些基础知识的介绍。

Solidity

Solidity is an object-oriented programming language for writing smart contracts. It is used for implementing smart contracts on various blockchain platforms, most notably, Ethereum. It was developed by Christian Reitwiessner, Alex Beregszaszi, and several former Ethereum core contributors to enable writing smart contracts on blockchain platforms such as Ethereum. ------ from

Solidity 是一种用于编写智能合约的高级语言,语法类似于 JavaScript。在以太坊平台上,Solidity 编写的智能合约可以被编译成字节码在以太坊虚拟机 EVM 上运行。

可参考 进行学习,不再展开介绍。

MetaMask

非常好用也是用的最多的以太坊钱包,头像是小狐狸标识,Chrome 提供了其插件,其不仅可以管理外部账户,而且可以便捷切换测试链网络,并且可以自定义 RPC 网络。

!!! info 一个外部账户通常由私钥文件控制,拥有私钥的用户就可以拥有对应地址的账户里的 Ether 使用权。我们通常把管理这些数字密钥的软件称为钱包,而我们所说的备份钱包其实就是备份账户的私钥文件。

Remix

基于浏览器的 Solidity 编译器和集成开发环境,提供了交互式界面,以及编译、调用测试、发布等一系列功能,使用十分方便。

账户

在以太坊中,一个重要的概念就是账户(Account)。

在以太坊中存在两种类型的账户,分别是外部账户(Externally Owned Account, EOA)和合约账户。

外部账户

外部账户是由人创建的,可以存储以太币,是由公钥和私钥控制的账户。每个外部账户拥有一对公私钥,这对密钥用于签署交易,它的地址由公钥决定。外部账户不能包含以太坊虚拟机(EVM)代码。

一个外部账户具有以下特性

  • 拥有一定的 Ether

  • 可以发送交易、通过私钥控制

  • 没有相关联的代码

合约账户

合约账户是由外部账户创建的账户,包含合约代码。合约账户的地址是由合约创建时合约创建者的地址,以及该地址发出的交易共同计算得出的。

一个合约账户具有以下特性

  • 拥有一定的 Ether

  • 有相关联的代码,代码通过交易或者其他合约发送的调用来激活

  • 当合约被执行时,只能操作合约账户拥有的特定存储

!!! note 私钥经过一种哈希算法(椭圆曲线算法 ECDSA-secp256k1 )计算生成公钥,计算公钥的 Keccak-256 哈希值,然后取最后 160 位二进制(通常表现为 40 位的 16 进制字符串)形成了地址。其中,公钥和地址都是可以公布的,而私钥,你只能自己悄悄的藏起来,不要丢失,因为你的账户中的资产也会跟着丢掉;不要被别人盗取,因为账户中的资产也会随着被盗取。所以,私钥的保存非常重要。

以太坊中,这两种账户统称为“状态对象”(存储状态)。其中外部账户存储以太币余额状态,而合约账户除了余额还有智能合约及其变量的状态。通过交易的执行,这些状态对象发生变化,而 Merkle 树用于索引和验证状态对象的更新。一个以太坊的账户包含 4 个部分:

  • nonce: 已执行交易总数,用来标示该账户发出的交易数量。

  • balance: 账持币数量,记录账户的以太币余额。

  • storageRoot: 存储区的哈希值,指向智能合约账户的存储数据区。

  • codeHash: 代码区的哈希值,指向智能合约账户存储的智能合约代码。

两个外部账户之间的交易只是一个价值转移。但是从外部账户到合约账户的交易会激活合约账户的代码,允许它执行各种操作(例如转移 Token,写入内部存储,创建新的 Token ,执行一些计算,创建新的合约等)。

与外部账户不同,合约账户不能自行发起新的交易。相反,合约帐户只能触发交易以响应其他交易(从外部拥有的帐户或其他合约帐户)。

!!! note 注:合约账户和外部账户最大的不同就是它还存有智能合约。

交易

以太坊的交易主要是指一条外部账户发送到区块链上另一账户的消息的签名数据包,其主要包含发送者的签名、接收者的地址以及发送者转移给接收者的以太币数量等内容。以太坊上的每一笔交易都需要支付一定的费用,用于支付交易执行所需要的计算开销。计算开销的费用并不是以太币直接计算的,而是引入 Gas 作为执行开销的基本单位,通过 GasPrice 与以太币进行换算的。

GasPrice 根据市场波动调整,避免以太币价值受市场价格的影响。交易是以太坊整体结构中的重要部分,它将以太坊的账户连接起来,起到价值的传递作用。

交易费用

  • Gas: 衡量一笔交易所消耗的计算资源的基本单位

  • Gas Price: 一单位 Gas 所需的手续费(Ether)

  • Gas Limit: 交易发送者愿意为这笔交易执行所支付的最大 Gas 数量

!!! note 注:如果交易实际消耗的 Gas (Gas Used) 小于 Gas Limit, 那么执行的矿工只会收取实际计算开销(Gas Used)对应的交易手续费(Gas Used * Gas Price);而如果 Gas Used 大于 Gas Limit,那么矿工执行过程中会发现 Gas 已被耗尽而交易没有执行完成,此时矿工会回滚到程序执行前到状态,而且收取 Gas Limit 所对应的手续费(GasPrice * Gas Limit)。换句话说,GasPrice * Gas Limit 表示用户愿意为一笔交易支付的最高金额。

交易内容

以太坊中的交易(Transaction)是指存储一条从外部账户发送到区块链上另一个账户的消息的签名数据包,它既可以是简单的转账,也可以是包含智能合约代码的消息。一条交易包含以下内容:

  • from: 交易发送者的地址,必填;

  • to: 交易接收者的地址,如果为空则意味这是一个创建智能合约的交易;

  • value: 发送者要转移给接收者的以太币数量

  • data: 存在的数据字段,如果存在,则表明该交易是一个创建或者调用智能合约的交易;

  • Gas Limit: 表示交易允许消耗的最大 Gas 数量;

  • GasPrice: 发送者愿意支付给矿工的 Gas 单价;

  • nonce: 用来区别同一账户发出的不同交易的标记;

  • hash: 由以上信息生成的散列值(哈希值);

  • r、s、v: 交易签名的三个部分,由发送者的私钥对交易 hash 进行签名生成。

以上是以太坊中交易可能包含的内容,在不同场景下,交易有三种类型。

  • 转帐交易

转账是最简单的一种交易,从一个账户向另一个账户发送 Ether,发送转账交易时只需要指定交易的发送者、接收者、转移的 Ether 数量即可(在客户端发送交易时,Gas Limit、Gas Price、nonce、hash、签名可以按照默认方式生成),如下所示

web3.eth.sendTransaction({
    from: "0x88D3052D12527F1FbE3a6E1444EA72c4DdB396c2",
    to: "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f",
    value: 1000
})
  • 创建合约的交易

创建合约是指将合约部署到区块链上,这也是通过交易来完成的。创建合约时,to 字段是一个空字符串,data 字段是合约编译后的二进制代码,在之后合约被调用时,该代码的执行结果将作为合约代码,如下所示

web3.eth.sendTransaction({
    from: "0x88D3052D12527F1FbE3a6E1444EA72c4DdB396c2",
    data: "contract binary code"
})
  • 执行合约的交易

该交易中,to 字段是要调用的智能合约的地址,通过 data 字段指定要调用的方法以及向该方法传入参数,如下所示

web3.eth.sendTransaction({
    from: "0x88D3052D12527F1FbE3a6E1444EA72c4DdB396c2",
    to: "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f",
    data: "hash of the invoked method signature and encoded parameters"
})

!!! info 根据 to、data 字段内容也可以反过来判断是什么类型的交易,然后可以继续分析。

Interact with Contracts

  • 直接通过 Remix 交互

  • Remix 不能够做到自动化,所以便有开发人员做了一些工作

    • Python 的 web3.py 库

    • Nodejs 的 web3.js 库

Infura 现支持如下网络的访问点:

网络
说明
URL

Mainnet

JSON-RPC over HTTPs

https://mainnet.infura.io/v3/YOUR-PROJECT-ID

Mainnet

JSON-RPC over websockets

wss://mainnet.infura.io/ws/v3/YOUR-PROJECT-ID

Ropsten

JSON-RPC over HTTPs

https://ropsten.infura.io/v3/YOUR-PROJECT-ID

Ropsten

JSON-RPC over websockets

wss://ropsten.infura.io/ws/v3/YOUR-PROJECT-ID

Rinkeby

JSON-RPC over HTTPs

https://rinkeby.infura.io/v3/YOUR-PROJECT-ID

Rinkeby

JSON-RPC over websockets

wss://rinkeby.infura.io/ws/v3/YOUR-PROJECT-ID

Kovan

JSON-RPC over HTTPs

https://kovan.infura.io/v3/YOUR-PROJECT-ID

Kovan

JSON-RPC over websockets

wss://kovan.infura.io/ws/v3/YOUR-PROJECT-ID

Görli

JSON-RPC over HTTPs

https://goerli.infura.io/v3/YOUR-PROJECT-ID

Görli

JSON-RPC over websockets

wss://goerli.infura.io/ws/v3/YOUR-PROJECT-ID

Mainnet(eth2)

JSON-RPC over HTTPs

https://YOUR-PROJECT-ID:YOUR-PROJECT-SECRET@eth2-beacon-mainnet.infura.io

pyrmont(eth2)

JSON-RPC over websockets

wss://YOUR-PROJECT-ID:YOUR-PROJECT-SECRET@eth2-beacon-mainnet.infura.io

Filecoin

JSON-RPC over HTTPs

https://YOUR-PROJECT-ID:YOUR-PROJECT-SECRET@filecoin.infura.io

Filecoin

JSON-RPC over websockets

wss://YOUR-PROJECT-ID:YOUR-PROJECT-SECRET@filecoin.infura.io

!!! note 注:使用时,请务必使用你的Infura仪表盘 中的项目 ID/Project ID 或 Project Secret 来替换以上 URL 中的 YOUR-PROJECT-ID 或 YOUR-PROJECT-SECRET

下面是使用 web3.py 和 Infura API 与智能合约进行交互调用合约函数选择器为 0x00774360 的函数的例子

from web3 import Web3, HTTPProvider

w3 = Web3(Web3.HTTPProvider("https://rinkeby.infura.io/v3/YOUR-PROJECT-ID"))

contract_address = "0x31c883a9aa588d3f890c26c7844062d99444b5d6"
private = "your private key"
public = "0x75e65F3C1BB334ab927168Bd49F5C44fbB4D480f"

def deploy(public):
    txn = {
        'from': Web3.toChecksumAddress(public),
        'to': Web3.toChecksumAddress(contract_address),
        'gasPrice': w3.eth.gasPrice,
        'gas': 3000000,
        'nonce': w3.eth.getTransactionCount(Web3.toChecksumAddress(public)),
        'value': Web3.toWei(0, 'ether'),
        'data': '0x007743600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a6100016100016100016100016100016100650361000161fbfbf1000000000000',
    }
    signed_txn = w3.eth.account.signTransaction(txn, private)
    txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction).hex()
    txn_receipt = w3.eth.waitForTransactionReceipt(txn_hash)
    print("txn_hash=", txn_hash)
    return txn_receipt

print(deploy(public))

tx.origin vs msg.sender

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

  • 给定这样一个场景如:用户通过合约 A 调合约B,此时:

    • 对于合约 A : tx.origin 和 msg.sender 都是用户

    • 对于合约 B : tx.origin 是用户,msg.sender 是合约 A

提供了 RPC API 供开发者调用,现支持 Ethereum、Eth2、Filecoin

使用 提供的 RPC API,利用 web3.py 或者 web3.js 库与其进行自动化交互

wikipedia
官方网站
http://remix.ethereum.org/
Infura
Infura