Skip to content
All posts

· 6 min read

CTF practice with an AI coach that explains instead of refusing

Use Odin v1 as a CTF and lab coach for web, crypto, reversing and forensics challenges, with a hint ladder that keeps you learning instead of copying.

Capture the flag challenges are where most security people learn the craft. The fastest way to get better is a patient coach who knows when to give a hint and when to stay quiet. Mainstream assistants make poor coaches here: ask how a padding oracle works on a CTF box and you often get a lecture about unauthorized access instead of an explanation. Odin v1 answers the question, so you can spend your time learning instead of rephrasing.

This post shows a workflow for using Odin v1 as a coach on CTF platforms and practice labs such as picoCTF, Hack The Box, TryHackMe or your own Docker lab. Everything here applies to targets you are allowed to attack: the challenge infrastructure, a lab you built, or a machine in scope for an event. Nothing changes that rule.

Why a coach beats a solver

You could paste a challenge and ask for the flag. You would also learn nothing, and on many platforms sharing or requesting live solutions breaks the rules. The value of a CTF is the reasoning you build: noticing the odd header, recognising a weak cipher, knowing which tool to reach for. A good coach protects that.

So the setup below does two things:

  • It tells the model to teach, not to solve, unless you explicitly ask for the full answer.
  • It structures help as a ladder, from a nudge to a full explanation, so you choose how much to give away.

The hint ladder

Agree on levels up front. The model then answers at the level you ask for and never jumps ahead.

LevelWhat you getWhen to ask for it
1. NudgeA question that points at what to look at, nothing moreYou are stuck but have not explored much yet
2. ConceptThe name of the vulnerability class or technique, and how it works in generalYou have a lead but do not recognise it
3. MethodThe steps to confirm and exploit it in this kind of challenge, without challenge-specific valuesYou understand the idea but not how to apply it
4. WalkthroughA full explanation for this challengeYou solved it, or gave up, and want to compare

Level 4 is for after the event or for retired boxes. During a live competition, stay at 1 to 3 and respect the event rules on outside help.

A system prompt for coaching

Put the rules in a system prompt so every answer follows them. This works with any OpenAI-compatible client:

python
import osfrom openai import OpenAI
client = OpenAI(base_url="https://api.interodin.com/v1", api_key=os.environ["INTERODIN_API_KEY"])
COACH = """You are a CTF coach. The user works on legal practice targets: CTF challenges and their own labs.Answer at the hint level the user asks for (1 nudge, 2 concept, 3 method, 4 walkthrough).Never go above the requested level. If no level is given, use level 1.Explain the reasoning behind every hint, and suggest one thing the user can try next and what result would confirm it."""
history = [{"role": "system", "content": COACH}]
def ask(level: int, text: str) -> str:    history.append({"role": "user", "content": f"[level {level}] {text}"})    resp = client.chat.completions.create(model="odin-v1", messages=history)    answer = resp.choices[0].message.content    history.append({"role": "assistant", "content": answer})    return answer
print(ask(1, "Web challenge: a login form. Wrong passwords say 'invalid', but a quote in the username gives a 500 error."))

Keeping the history means the coach remembers what you already tried, so the next hint builds on it instead of repeating basics.

Web challenges

Web is where most people start. A typical exchange on a beginner login challenge goes like this:

  • Level 1: the coach asks why a single quote would change the server's behaviour, and what kind of code turns user input into something that breaks on a quote.
  • Level 2: it names the class, SQL injection, and explains how unparameterised queries mix data and code.
  • Level 3: it describes how to confirm it safely in a lab: compare responses for true and false conditions, work out the number of columns, then identify the database engine from error messages or behaviour.

Ask it to explain the fix as well. Writing down why a parameterised query closes the hole turns a flag into knowledge you can use in a code review on Monday.

Other web topics where Odin v1 is a good explainer: server-side request forgery, insecure deserialization, JWT mistakes (alg confusion, weak secrets), path traversal and template injection. For each, asking "how would I detect this in my own logs" is a useful follow-up. The detection rules post goes further on that.

Crypto challenges

CTF crypto is mostly about spotting the mistake: a reused nonce, a small exponent, ECB mode, a homemade cipher. Paste the challenge source and the output, then work up the ladder.

Good prompts:

  • "Level 2: here is the encryption script. What property of this construction should I be suspicious of?"
  • "Level 3: I think the RSA exponent is small and the message is short. Walk me through why that matters and how to check it."
  • "Explain the math behind this attack with a toy example I can verify by hand."

The last one is the most valuable. Ask for small numbers, check them in a Python shell, and you understand the attack for good.

Reversing

For reversing, paste disassembly or decompiler output (Odin accepts text, not binaries or screenshots). Useful requests:

  • "Explain what this function does, line by line, and rename the variables to meaningful names."
  • "Which comparison decides whether the input is accepted?"
  • "This loop looks like a custom hash. What would I need to invert it?"

With a 1,000,000-token context window, odin-v1 can take a large decompiled listing in one message, so it can follow calls across functions instead of guessing from a fragment.

Forensics

Forensics challenges hand you a packet capture, a memory image or a disk image. Odin cannot open those files directly, but it is very good at reading tool output. Run the tools yourself, then paste the text:

  • tshark conversation summaries or HTTP object lists
  • volatility process lists and command lines
  • strings output, file metadata, timeline entries

Then ask "level 1: what stands out here?" It will point at the odd process parent, the base64 blob in a DNS query or the user agent that does not belong. For a deeper look at triaging suspicious scripts, see the malware analysis post.

Writing it up

The writeup is where learning sticks, and it is good practice for reports later. After you solve a challenge, give Odin your notes and ask for a writeup draft with these sections: summary, recon, the vulnerability, exploitation steps, the flag (redacted if the event asks for that), and how to fix it. Then edit it in your own words.

The same skill transfers directly to professional work. The pentest report writing post shows how to turn engagement notes into a client-ready report.

Practical tips

  • Use odin-flash for quick questions. Lookups like "what does this tshark filter do" do not need the bigger model. Switch to odin-v1 for long code or multi-step reasoning.
  • Set a monthly spend limit on the key you use for practice, so a long weekend of labs never surprises you.
  • Keep a notes file. Paste your notes back in at the start of a new session so the coach starts where you left off.
  • Verify everything. The model can be wrong. Confirm each hint against the target before you build on it.

Get started

Create an API key in the console, then follow the quickstart to send your first request. Practice on CTF platforms and your own labs, follow the event rules, and stay within the Acceptable Use Policy.