Sui.

Beitrag

Teile dein Wissen.

article banner.
harry phan.
Jun 30, 2025
Artikel

Ein Hacker-Leitfaden zur Eroberung von Move CTF 2025 (Woche 1)

Im Bereich Blockchain-Sicherheit gibt es kein besseres Trainingsgelände als eine Capture The Flag (CTF) -Herausforderung.

Entwickler entwickeln ihre Fähigkeiten im Feuer eines freundschaftlichen Wettbewerbs. Die Move CTF 2025 Week 1-Herausforderung auf der Sui-Blockchain ist ein perfektes Beispiel, um Ihr Verständnis der Move-Sprache zu testen.

Wir werden von der Einrichtung der Umgebung über die Analyse der Abwehrmechanismen des Smart Contracts, die Erstellung eines Solver-Skripts bis hin zur Ausführung der Transaktion übergehen, die den begehrten Preis enthüllt: CTF {letsMoveCTF_week1}.

Egal, ob Sie ein Move-Anfänger oder ein erfahrener Sicherheitsforscher sind, diese Komplettlösung bietet einen praktischen Leitfaden, mit dem Sie Ihre Fähigkeiten verbessern können. Lass uns eintauchen!

Schritt 1: Aufklärung — Das Ziel verstehen

Bevor wir eine einzige Codezeile schreiben, besteht unsere erste Aufgabe darin, das Schlachtfeld zu verstehen. Im Mittelpunkt der Herausforderung steht ein einziges Move-Modulweek1::challenge, das wir analysieren müssen.

public struct Challenge has key {
    id: UID,
    secret: String,
    current_score: u64,
    round_hash: vector<u8>,
    finish: u64,
}

Unsere Mission ist es, einfach ausgedrückt, die get_flagEingabefunktion erfolgreich aufzurufen. Ein erfolgreicher Anruf löst einen ausFlagEvent, der unseren Sieg und die Flagge an das gesamte Netzwerk überträgt.

Die get_flagFunktion ist jedoch durch eine Reihe von fünf verschiedenen Validierungsprüfungen geschützt. Um erfolgreich zu sein, müssen wir sie alle in einer einzigen Transaktion erfüllen.

Schritt 2: Die Verteidigung dekonstruieren — Die fünf Hürden

get_flagDie assert!Funktion ist eine Festung, und ihre Mauern bestehen aus Statements. Lassen Sie uns jede dieser Hürden nacheinander überwinden.

Hürde 1: Der Score-Check

Die Aufgabe: Berechnet den sha3_256-Hash des aktuellen challenge.secret-Strings. Die richtige Punktzahl ist eine u64-Zahl, die aus den ersten 4 Byte dieses Hashs abgeleitet wird (in der Big-Endian-Byte-Reihenfolge).

Das Konzept: Dies ist eine grundlegende kryptografische Herausforderung, um sicherzustellen, dass Sie Hashing und Byte-Manipulation korrekt durchführen können, wie es der Vertrag vorschreibt.

Hürde 2: Der Rätseltest (Ein Proof-of-Work-Puzzle)

Die Aufgabe: Finden Sie eine Vermutung (einen Byte-Vektor, der als Nonce fungiert), sodass, wenn Sie Ihre Vermutung und das Geheimnis zusammenfügen (sha3_256 (guess || secret))), die ersten beiden Byte des resultierenden Hashs mit den ersten beiden Bytes von challenge.round_hash übereinstimmen.

Das Konzept: Dies ist ein klassischer Proof-of-Work (PoW) -Mechanismus. Es kann nicht mathematisch gelöst werden; es erfordert Rechenaufwand („rohe Gewalt“), um eine gültige Vermutung zu finden, die beweist, dass Sie Ressourcen für die Lösung aufgewendet haben.

Hürde 3: Der hash_input-Check (Identitätsbindung)

Die Aufgabe: Geben Sie einen Hash an, der das Geheimnis und Ihre persönliche github_id korrekt kombiniert. Der Trick dabei ist, dass das Geheimnis zuerst mithilfe der binären kanonischen Serialisierung (bcs: :to_bytes) serialisiert werden muss. Das unterscheidet sich von der bloßen Verwendung seiner Rohbytes, da BCS den Daten ihre Länge voranstellt. Die endgültige Berechnung lautet sha3_256 (bcs (secret) || github_id).

Das Konzept: Diese Prüfung verknüpft Ihre Lösung mit Ihrer eindeutigen Kennung und verhindert so, dass andere Ihre erfolgreiche Transaktion einfach wiederholen. Die Verwendung von BCS ist ein gängiges Muster in Move und ein wichtiges Detail, das es zu beachten gilt.

Hürde 4 & 5: Der Seed- und Magic_Number-Check

Die Aufgabe: Diese beiden Parameter sind miteinander verknüpft.

Der Startwert wird als Länge (geheim) * 2 berechnet.

magic_number wird berechnet als (score% 1000) + seed.

Das Konzept: Dies sind Logikrätsel, die deine Fähigkeit testen, den Move-Code sorgfältig zu lesen und seine einfachen Rechenoperationen zu replizieren.

Schritt 3: Einrichtung Ihres Toolkits — Umgebung und Bereitstellung

Nachdem wir die Theorie verstanden haben, ist es an der Zeit, uns die Hände schmutzig zu machen.

Stellen Sie zunächst sicher, dass Ihre Sui CLI für das Testnetz installiert und konfiguriert ist.

# Check your Sui version
sui --version
> sui 1.50.1-homebrew

# Check your active environment
sui client envs
> testnet

# Check your active address and gas balance
sui client active-address
sui client gas

Erstellen Sie als Nächstes den Move-Vertrag und veröffentlichen Sie ihn im Sui-Testnetz. Dadurch wird der Code kompiliert und bereitgestellt, wodurch das erste gemeinsame ChallengeObjekt erstellt wird, mit dem wir interagieren müssen.

# Build the project
sui move build

# Publish the contract to the testnet
sui client publish --gas-budget 100000000

Nach einer erfolgreichen Veröffentlichung gibt die CLI die Ergebnisse aus, einschließlich zweier wichtiger Informationen, die Sie speichern müssen:

Paket-ID: Die Adresse Ihres neu veröffentlichten Vertrags. Objekt-ID: Die Adresse des gemeinsam genutzten ChallengeObjekts, das von der initFunktion erstellt wurde.

Schritt 4: Die Schlüssel fälschen — Den Python-Solver herstellen

get_flagJetzt müssen wir die richtigen Argumente berechnen, an die übergeben werden sollen. Das manuell zu tun ist mühsam, also schreiben wir ein Python-Skript, um es zu automatisieren. Dieses Skript liest den Anfangsbuchstaben secret„LetsMoveCTF_Week1" und berechnet alle fünf erforderlichen Parameter.

import hashlib

# --- Configuration ---
github_id = b"qiaopengjun5162"
secret = b"Letsmovectf_week1"

# --- 1. Calculate Score ---
hash_bytes = hashlib.sha3_256(secret).digest()
score = int.from_bytes(hash_bytes[:4], 'big')
print(f"✅ Score: {score}")

# --- 2. Solve Proof-of-Work for Guess ---
target_prefix = hash_bytes[:2]
found_guess = None
for i in range(1000000): # Brute-force loop
    guess_candidate = f"guess{i}".encode()
    combined_data = guess_candidate + secret
    random_hash = hashlib.sha3_256(combined_data).digest()
    if random_hash[:2] == target_prefix:
        found_guess = guess_candidate
        print(f"✅ Guess Found: {found_guess.decode()}")
        print(f"   (as hex): {found_guess.hex()}")
        break

# --- 3. Calculate Hash Input (with BCS) ---
# BCS serialization for a string prepends its length as a ULEB128 integer.
# For short strings, this is just a single byte representing the length.
bcs_encoded_secret = bytes([len(secret)]) + secret
bcs_input_data = bcs_encoded_secret + github_id
hash_input = hashlib.sha3_256(bcs_input_data).digest()
print(f"✅ Hash Input (hex): {hash_input.hex()}")

# --- 4 & 5. Calculate Seed and Magic Number ---
secret_len = len(secret)
seed = secret_len * 2
magic_number = (score % 1000) + seed
print(f"✅ Seed: {seed}")
print(f"✅ Magic Number: {magic_number}")

Schritt 5: The Heist — get_flag aufrufen und den Preis gewinnen Nachdem wir unsere Parameter berechnet haben, verwenden wir ein anderes Python-Skript, um den endgültigen Befehl sui client call zu konstruieren und auszuführen. Dies automatisiert den mühsamen Prozess der Formatierung der Argumente für die Befehlszeile.

call_get_flag.py (Zusammenfassung)

import subprocess

# --- Configuration (using values from previous script) ---
package_id = "0x804c92e4eef709b83f135d6cc667005ce35d7eccd49384570cbd7b1b40e32434"
challenge_id = "0xd28bc35560711a8b6ca93e2bf8e353fa6e17c15cbc426c48ece1ade9d83ce5ee"
random_id = "0x8"     # Default Random object on Sui
gas_budget = "10000000"

# --- Calculated Parameters ---
score = 1478524421
guess = [103, 117, 101, 115, 115, 55, 54, 57, 48, 56] # b'guess76908'
hash_input = [...] # The full byte array from the solver
github_id = "qiaopengjun5162"
magic_number = 455
seed = 34

# --- Construct and Execute the Sui CLI Command ---
command = [
    "sui", "client", "call",
    "--package", package_id,
    "--module", "challenge",
    "--function", "get_flag",
    "--args",
    str(score), str(guess), str(hash_input), f'"{github_id}"',
    str(magic_number), str(seed), challenge_id, random_id,
    "--gas-budget", gas_budget
]

# Execute the command and print the output
result = subprocess.run(command, capture_output=True, text=True, check=True)
print(result.stdout)

Beim Ausführen dieses Skripts wird die Transaktion gesendet. Wenn alle unsere Parameter korrekt sind, wird in der Ausgabe Status: Success und vor allem das ausgegebene FlagEvent angezeigt:

"ParsedJSON": {
  "flag": "CTF{Letsmovectf_week1}",
  "github_id": "qiaopengjun5162",
  "rank": "1",
  "success": true
}

Erfolg! Die Flagge ist erobert.

Ein gut durchdachtes CTF endet nicht nach einer Lösung. Nach unserem erfolgreichen Aufruf generiert die Funktion get_flag mithilfe des Random-Objekts ein neues Geheimnis und aktualisiert das Challenge-Objekt.

Ich habe dies bestätigt, indem ich das Objekt erneut abgefragt, ein neues Geheimnis gefunden und den Vorgang wiederholt habe. Meine Solver-Skripte waren wiederverwendbar — ich musste nur die geheime Variable aktualisieren, die Berechnung erneut ausführen und den Aufruf erneut ausführen, um die Flagge ein zweites und drittes Mal zu erobern und die Rangliste zu erklimmen.

https://suiscan.xyz/testnet/tx/AzJywLk8zv1Fx5Pc8p4ZrZwFZQ9hmTbtvweo14MVn8fZ

Fazit: Mehr als nur eine Flagge

Es war eine unglaubliche Lernerfahrung, die Move CTF 2025 Week 1-Herausforderung anzugehen. Es zwang mich, über die Theorie hinauszugehen und mich direkt mit der Sui-Blockchain auseinanderzusetzen, wodurch Schlüsselkonzepte wie die folgenden gestärkt wurden:

Intelligente Vertragslogik: Das sorgfältige Lesen und Verstehen des Move-Codes ist von größter Bedeutung.

Kryptografie in der Praxis: Anwendung von Hashing (sha3_256) und Verständnis der Byte-Manipulation.

On-Chain-Mechanik: Die Bedeutung bestimmter Serialisierungsformate wie BCS.

Automatisierung: Verwendung von Skripten, um komplexe, wiederholbare Aufgaben überschaubar zu machen.

Diese Herausforderung ist ein Beweis für die Macht des praktischen Lernens. Wenn Sie Ihre Fähigkeiten in den Bereichen Blockchain-Entwicklung und -Sicherheit erweitern möchten, empfehle ich Ihnen dringend, sich mit dem zu befassen

  • Sui
2
Teilen
Kommentare
.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610Beiträge1335Antworten
Sui.X.Peera.

Verdiene deinen Anteil an 1000 Sui

Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

BelohnungskampagneJuli