CTF toolkit: lib (net, crypto_utils), templates per category, scaffold, cheatsheet, ps_and_qs example

This commit is contained in:
asepharyana
2026-08-16 21:55:22 +07:00
commit dd45833322
25 changed files with 736 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env python3
"""
scaffold.py — generate a new CTF / task skeleton (p4-team style).
Usage:
python3 scaffold.py new hitcon "HITCON CTF 2024" 5 700
python3 scaffold.py add hitcon "Safe Bank" pwn
"""
from pathlib import Path
from datetime import datetime
import argparse
import re
TEMPLATES = {
"pwn": "pwn_skeleton.py",
"crypto": "crypto_skeleton.py",
"web": "web_skeleton.py",
"re": "re_skeleton.py",
"reverse": "re_skeleton.py",
"forensics": "forensics_skeleton.py",
"misc": "misc_skeleton.py",
}
ROOT = Path(__file__).parent
def new_ctf(args):
stamp = datetime.now().isoformat()[:10]
dirname = f"{stamp}-{args.slug}"
newdir = ROOT / dirname
newdir.mkdir(exist_ok=True)
(newdir / "README.md").write_text(f"# {args.name}\n\n### Table of contents\n")
print(f"[+] created {dirname}/")
def add_task(args):
matches = sorted(ROOT.glob(f"*-{args.slug}"))
if not matches:
print("no such CTF slug"); return
d = matches[-1]
slug = re.sub(r"[^a-z0-9]+", "-", args.task.lower())
taskdir = d / slug
taskdir.mkdir(exist_ok=True)
tmpl = TEMPLATES.get(args.category, "pwn_skeleton.py")
src = (ROOT / "templates" / tmpl).read_text()
(taskdir / "solve.py").write_text(src)
rd = d / "README.md"
rd.write_text(rd.read_text() + f"* [{args.task} ({args.category})]({slug})\n")
print(f"[+] added {taskdir}/solve.py")
def main():
p = argparse.ArgumentParser()
sub = p.add_subparsers(dest="cmd", required=True)
n = sub.add_parser("new"); n.add_argument("slug"); n.add_argument("name"); n.add_argument("place"); n.add_argument("teams"); n.set_defaults(func=new_ctf)
a = sub.add_parser("add"); a.add_argument("slug"); a.add_argument("task"); a.add_argument("category"); a.set_defaults(func=add_task)
args = p.parse_args()
args.func(args)
if __name__ == "__main__":
main()