NepCTF 2024 wp
推测出题人的预期解,详细写了写区块链
misc
Nemophila
所以镜莲华的花语是?
二血
|
|
|
|
第 4 个字母没有提示,根据语义猜测是 r
然后密码不是通过所有条件,而是 exit 在最后一个
|
|
密码是
|
|
解压后拿到一个 png,但是乱码
xor png 头可以发现 xor 的 key 还是密码
然后再改大图片高度
|
|
3DNep
二血
文件头,glTF
找个在线预览
https://products.aspose.app/3d/zh-cn/viewer/gltf
底部是汉信码
调色一下
|
|
blockchain
theif_god
容器启动后 3 分钟再进行攻击 题目只提供部分合约部署代码以及攻击者账户密钥
Tips: 本次区块链题目 只是为了让大家多多少少都接触下 WEB3 ,题目本身没有很难 属于签到难度,只需在线即时学习即可完成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
from web3 import Web3 # 连接到本地节点 web3 = Web3(Web3.HTTPProvider("https://neptune-xxxxx.nepctf.lemonprefect.cn")) # 定义一个函数来扫描区块链并查找合约创建交易 def find_contract_addresses(start_block, end_block): contract_addresses = [] for block_number in range(start_block, end_block + 1): block = web3.eth.get_block(block_number, full_transactions=True) for tx in block.transactions: if tx.to is None: receipt = web3.eth.get_transaction_receipt(tx.hash) contract_addresses.append(receipt.contractAddress) return contract_addresses # 扫描区块范围 start_block = 0 # 起始区块 end_block = web3.eth.block_number # 当前最新区块 contracts = find_contract_addresses(start_block, end_block) print("Deployed contract addresses:") for address in contracts: print(address)
附件:https://pan.baidu.com/s/1vuzalD8A3BKpQWYnoqOB3A?pwd=s5o6
题目附件里面可以看到合约部分
|
|
很明显的重入攻击
在 hardhat.config.js
可以看到一个 priKey,该账户里面有 10ether
|
|
题目描述
https 访问:
|
|
说明是 RPC
geth 连不上 rpc,那就用 web3.py
做法 1
可以发现 flag 直接就在 slot1 里,虽然直接读 slot 读不到(
|
|
读 block
|
|
直接看 input
做法 2 (预期解)
题目最早是没给任何提示的
先摸索出动态靶机是 rpc
然后再写脚本读
其实一共就四个 block
|
|
|
|
其实 block 2 的也有一个合约
用来给 Bank.sol
存入初始的 50eth,用于完成攻击
所以重入是为了取出他人存在合约里的余额
getBalance 可以看到里面有 50Ether
不过题目环境很卡(
|
|
重入攻击的原理是由于目标合约通过 msg.sender.call{value: balance}("")
的方式转账
且先转账再减钱
fallback()
的特点 在合约调用没有匹配到函数签名,或者调用没有带任何数据时被自动调用。
所以这题如果在 fallback里面
写 withdraw()
会被反复触发,也就是重入
部署攻击合约
往 exp 合约存一点,1 Gwei 也行
然后打 attack 重放
会把里面的 50eth 都取出到 exp 合约里
再把钱提到账户里,存回到题目合约里
满足条件,拿到 flag