许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  2022 Paradigm CTF:RIDDLE-OF-THE-SPHINX题解(writeup)

2022 Paradigm CTF:RIDDLE-OF-THE-SPHINX题解(writeup)

阅读数 4
点赞 0
article_banner

题目

在这里插入图片描述

   同上一题,只是这次的环境不是 evm ,而是cairo.

   riddle-of-the-sphinx对应合约 代码 ,贴在后面。

实现&分析

flag 返回前提

还是一样的流程,flag返回前提变化:

async def checker(client: AccountClient, riddle_contract: Contract, player_address: int) -> bool:
    solution = (await riddle_contract.functions["solution"].call()).solution

    return to_bytes(solution).lstrip(b"\x00") == b"man"

关键返回内容转字符串后等于man。

思路

合约代码:

from starkware.cairo.common.cairo_builtins import HashBuiltin

@storage_var
func _solution() -> (res : felt):
end

@external
func solve{
    syscall_ptr : felt*,
    pedersen_ptr : HashBuiltin*,
    range_check_ptr,
}(solution : felt):
    _solution.write(solution)
    return ()
end

@view
func solution{
    syscall_ptr : felt*,
    pedersen_ptr : HashBuiltin*,
    range_check_ptr,
}() -> (solution : felt):
    let (solution) = _solution.read()
    return (solution)
end

调用 solution 方法查看_solution的值,调用solve方法写_solution,所以答案很明显了,调用solve传入值为man的数值即可。

题目内代码基本都有所有的调用方法,abi获取从remix编译后跳转可以查看。

调用值设定 类  似evm,不能用call,要用invoke,max_fee也要设置才行,具体实现见writeup。

writeup


from starknet_py.net.networks import *
from starknet_py.net.gateway_client import *
from starknet_py.net.http_client import *
from starknet_py.net import AccountClient,KeyPair
from starknet_py.contract import *
from starkware.python.utils import *
from starknet_py.net.full_node_client import FullNodeClient
from starknet_py.net import AccountClient
from starknet_py.cairo.felt import *
from starkware.crypto.signature.signature import private_to_stark_key
import threading,asyncio
from starkware.starknet.services.api.messages import StarknetMessageToL1, StarknetMessageToL2
from starkware.starknet.core.os.contract_address.contract_address import \
    calculate_contract_address_from_hash

uuid = "xxxx"
url = "xxxx"
pkey = xxxx
contract = xxxx
ticket = "xxxx"

config1 = {"abi":
    [
        {
            "name": "solve",
            "type": "function",
            "inputs": [
                {
                    "name": "solution",
                    "type": "felt"
                }
            ],
            "outputs": []
        },
        {
            "name": "solution",
            "type": "function",
            "inputs": [],
            "outputs": [
                {
                    "name": "solution",
                    "type": "felt"
                }
            ],
            "stateMutability": "view"
        }

]
}

async def getSolution():
    client = GatewayClient(url, TESTNET)
    pubkey = private_to_stark_key(pkey)
    fullNodeClient = AccountClient(
        client=client,
        address=calculate_contract_address_from_hash(
                salt=20,
                class_hash=1803505466663265559571280894381905521939782500874858933595227108099796801620,
                constructor_calldata=[pubkey],
                deployer_address=0,
            ),
        key_pair=KeyPair(
            private_key=pkey, public_key=private_to_stark_key(pkey)
        ),
        chain=StarknetChainId.TESTNET,
    )
    riddleContract = Contract(address=contract, abi=config1["abi"], client=fullNodeClient)

    result = (await riddleContract.functions['solve'].invoke(0x6d616e,max_fee=int(1e16)))
    print(result)
    solution = (await riddleContract.functions["solution"].call()).solution
    print("solution")
    print(solution)


asyncio.get_event_loop().run_until_complete(getSolution())





免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空