Overview
GZCTF games are time-bound CTF competitions where teams solve challenges to earn points. This guide covers the complete participation workflow from joining a game to submitting flags.Joining a Game
Browse Available Games
View recent and upcoming games:Games show status indicators:
- Upcoming: Registration open, game not started
- Active: Game in progress
- Ended: Game completed (practice mode may be available)
Select Your Team
Choose which team you want to represent in the game.
You must be a member of a team to participate. Create or join a team first if needed.
Check Join Requirements
Verify you meet the requirements:Requirements may include:
- Division Selection: Choose your competition division (if applicable)
- Invitation Code: Enter game/division invitation code (if required)
- Team Member Limit: Ensure your team doesn’t exceed the limit
- Not Already Registered: You can’t join with multiple teams
Viewing Challenges
Once your participation is accepted:- Challenges: All available challenges grouped by category
- Team Token: Your unique team authentication token
- Scoreboard Position: Your team’s current rank and score
- Writeup Requirements: Whether writeups are required after the game
Challenge Information
Each challenge includes:- Title & Description: Challenge details
- Category: Web, Pwn, Reverse, Crypto, Misc, etc.
- Difficulty: Points value (may be dynamic)
- Solved Count: Number of teams that solved it
- Blood Bonus: Extra points for first/second/third solves
Solving Challenges
Static Challenges
For challenges without dynamic containers:Read Challenge
Get full challenge details:Review:
- Challenge description
- Downloadable files
- Hints (if available)
- Connection information (if applicable)
Submit Flag
Submit your answer:
Flags are encrypted during transmission. The server decrypts and validates them.
Dynamic Container Challenges
For challenges requiring dedicated instances:Access Container
Connect to your instance using the provided entry point:
- HTTP: Open the URL in your browser
- TCP: Use
nc,telnet, or custom clients - SSH: Use SSH client with provided credentials
Extend Lifetime (Optional)
Containers automatically expire after a configured time (e.g., 2 hours).Extend within the renewal window (e.g., last 10 minutes):
Extension adds additional time (e.g., +2 hours) to prevent interruption during active solving.
Container Instance Lifecycle
Container States
- Provisioning: Container being created
- Running: Active and accessible
- Expired: Lifetime ended, will be destroyed
- Destroyed: Removed from cluster
Rate Limiting
Container operations are rate-limited to prevent abuse:- Too Frequent: Wait between create/destroy operations
- 429 Error: “Operation too frequent, please try again later”
Submission Limits
Challenges may have submission limits:- Unlimited: Submit as many times as needed
- Limited (e.g., 10 attempts): Restricted attempts per challenge
Check the challenge details for the current submission count and limit.
Leaving a Game
You can leave a game under certain conditions:Practice Mode
After a game ends, practice mode may be available:- Access: Join/rejoin ended games
- Features:
- All challenges available
- Flag submission works
- Scoreboards frozen (no rank changes)
- Writeup submission may still be required
Practice mode allows learning and training without competitive pressure.
Common Issues
”Game has ended”
Solution: You cannot join ended games unless practice mode is enabled.”You are not a member of this team”
Solution: Join the team before trying to register for games.”You are already in this game with another team”
Solution: You can only participate with one team. Leave the other team’s participation first (if still pending).”Container limit exceeded”
Solution: Destroy existing containers before creating new ones.”Extension not available”
Solution: Extensions only work within the renewal window (e.g., last 10 minutes before expiry).”Challenge not found”
Causes:- Challenge was disabled
- Your division doesn’t have permission to view it
- Challenge ID is incorrect
API Reference
See GameController.cs for complete implementation:POST /api/Game/{id}- Join game (GameController.cs:153-281)GET /api/Game/{id}/Details- Get challenges (GameController.cs:715-784)POST /api/Game/{id}/Challenges/{challengeId}- Submit flag (GameController.cs:951-1056)POST /api/Game/{id}/Container/{challengeId}- Create container (GameController.cs:1188-1254)POST /api/Game/{id}/Container/{challengeId}/Extend- Extend lifetime (GameController.cs:1256-1304)DELETE /api/Game/{id}/Container/{challengeId}- Destroy container (GameController.cs:1306-1374)