# Automated Solvers

One of the goals for `cmgr` is to further improve the state of CI/CD for CTFs.
Part of this is creating a framework for automated solvescripts that can check
the status and solvability of deployed challenges.  To enable this, we have
implemented a standardized mechanism for solve scripts that can be easily run
against individual challenge instances.

## Usage

To create a solver, a challenge author only needs to create a `solver` directory
inside of their challenge directory and add a `solve.py` script (Python 3) that
implements the solution (both regular build tools and `pwntools` are installed by default).

The `cmgr` interface will ensure any requested dependencies are installed prior to launching the script and will launch the script from a container in the same network as the challenge itself.  This allows the challenge author to leverage the standardized DNS naming convention (`challenge` for the container hosting the challenge and `solver` for the solve script container) as well as the static ports in use (5000/tcp for `cmgr` challenge types and whatever was chosen for "custom" challenges).

In addition to the files in the `solver` directory, `cmgr` will extract the artifacts given to competitors into the working directory of the solve script prior to launch.

Once the flag has been retrieved, the solve script should write the flag to a file named `flag` in the working directory and exit.

## Installing Dependencies

There are two means for installing additional dependencies that the solver
requires: `packages.txt` for `apt` packages and `requirements.txt` for `pip3`
modules.  Both files consist of a single dependency per line.  Note: although
`requirements.txt` supports pinning the version of each dependency, there is
currently no support for similar functionality in `packages.txt`.