56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
# src/ctf/cli_analyse.py
|
|
# {{{ imports
|
|
import click
|
|
from pathlib import Path
|
|
from rich.console import Console
|
|
from rich.panel import Panel
|
|
from ctf.analysis import run_analysis
|
|
# }}}
|
|
|
|
# {{{ analyse_cmd
|
|
@click.command(name="analyse")
|
|
@click.option('-f', '--file', type=click.Path(exists=True), help="Path to the challenge file to analyze.")
|
|
def analyse_cmd(file):
|
|
"""Dynamically analyze and try to solve the active challenge using static routes."""
|
|
console = Console()
|
|
console.print("[bold blue][*] Starting dynamic challenge analysis...[/bold blue]\n")
|
|
|
|
file_path = Path(file) if file else None
|
|
result = run_analysis(file_path)
|
|
|
|
for route in result.routes:
|
|
title = f"Route: {route.route_name}"
|
|
if not route.executed:
|
|
console.print(Panel(
|
|
f"[yellow]{route.message}[/yellow]",
|
|
title=title,
|
|
border_style="yellow"
|
|
))
|
|
elif route.success:
|
|
content = f"[green]{route.message}[/green]\n"
|
|
if route.details:
|
|
content += "\n[bold cyan]Details:[/bold cyan]\n"
|
|
for k, v in route.details.items():
|
|
content += f" • {k}: {v}\n"
|
|
if route.extracted_flags:
|
|
content += "\n[bold green]✓ Extracted Flags:[/bold green]\n"
|
|
for flag in route.extracted_flags:
|
|
content += f" [bold green]{flag}[/bold green]\n"
|
|
console.print(Panel(
|
|
content.strip(),
|
|
title=title,
|
|
border_style="green"
|
|
))
|
|
else:
|
|
console.print(Panel(
|
|
f"[red]✗ {route.message}[/red]",
|
|
title=title,
|
|
border_style="red"
|
|
))
|
|
|
|
if result.success:
|
|
console.print("\n[bold green]✓ Analysis complete. Challenge solved successfully![/bold green]")
|
|
else:
|
|
console.print("\n[bold yellow]! Analysis complete. No clear flag found yet.[/bold yellow]")
|
|
# }}}
|