fold/bench/corpora/ctf-challenges/fetch.sh
trvon 9161ed2b98
eval: CTF binary scan — 3.7% binary detection vs 66.7% source
- Binary scan: 1/27 findings (only gets() import detected)
- Source scan: 18/27 findings (66.7% TP rate)
- Fuzz harnesses: generated but cov:2 (Swift ABI issue)
- Binary backend needs significant improvement
2026-05-29 20:03:07 -04:00

129 lines
5.3 KiB
Bash
Executable file

#!/usr/bin/env bash
# fetch.sh — Compile CTF challenge binaries for fold binary validation
#
# Targets:
# 1. picoCTF 2022 — "buffer overflow 0" (CWE-121, stack-based overflow)
# 2. picoCTF 2023 — "VNE" (ARM64 binary, reverse-engineering challenge)
# 3. vuln-demo — custom CWE-121/CWE-134/CWE-416
#
# Sources live in src/ (hand-authored or reconstructed from public writeups).
# This script compiles them for ARM64 Mach-O, x86_64 Mach-O, and x86_64 ELF.
#
# Usage:
# ./fetch.sh # compile all
# ./fetch.sh --clean # remove all compiled artifacts
# ./fetch.sh --list # list what is available
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BIN_DIR="$SCRIPT_DIR/bin"
SRC_DIR="$SCRIPT_DIR/src"
mkdir -p "$BIN_DIR"
OS_NATIVE="$(uname -s)"
# CFLAGS separated by platform because macOS ld rejects ELF-only flags.
# macOS: Mach-O linker doesn't support -z, -no-pie, or -static the ELF way.
CFLAGS_MACOS="-O0 -g -fno-stack-protector -Wno-implicit-function-declaration"
CFLAGS_ELF="-O0 -g -fno-stack-protector -z execstack -no-pie -static"
# Colour helpers (safe for non-TTY)
BOLD=""; RED=""; GREEN=""; YELLOW=""; NC=""
[ -t 2 ] && BOLD="\033[1m" RED="\033[31m" GREEN="\033[32m" YELLOW="\033[33m" NC="\033[0m"
say() { printf "${GREEN}==>${NC} %s\n" "$*"; }
warn() { printf "${YELLOW}WARN:${NC} %s\n" "$*" >&2; }
err() { printf "${RED}ERROR:${NC} %s\n" "$*" >&2; exit 1; }
# ——————————————————————————————————————————————
# Compile a single source for macOS (ARM64 + x86_64 Mach-O)
# ——————————————————————————————————————————————
compile_macos() {
local src="$1" out_base="$2"
say " -> compiling ARM64 Mach-O"
clang $CFLAGS_MACOS -arch arm64 "$src" -o "${out_base}-arm64-macho" || warn "ARM64 compile failed"
chmod +x "${out_base}-arm64-macho" 2>/dev/null || true
rm -rf "${out_base}-arm64-macho.dSYM" 2>/dev/null || true
say " -> compiling x86_64 Mach-O"
clang $CFLAGS_MACOS -arch x86_64 "$src" -o "${out_base}-x86_64-macho" || warn "x86_64 Mach-O compile failed"
chmod +x "${out_base}-x86_64-macho" 2>/dev/null || true
rm -rf "${out_base}-x86_64-macho.dSYM" 2>/dev/null || true
}
# ——————————————————————————————————————————————
# Compile a single source for x86_64 ELF via Docker
# ——————————————————————————————————————————————
compile_elf_docker() {
local src="$1" out="$2"
if ! command -v docker &>/dev/null || ! docker info &>/dev/null 2>&1; then
warn "Docker not available — skipping x86_64 ELF build"
return 0
fi
say " -> compiling x86_64 ELF via Docker"
local src_name
src_name="$(basename "$src")"
docker run --rm --platform linux/amd64 \
-v "$src:/src/${src_name}:ro" \
-v "$BIN_DIR:/out" \
alpine:latest \
sh -c "apk add --no-cache gcc musl-dev >/dev/null 2>&1 && gcc $CFLAGS_ELF /src/${src_name} -o /out/$(basename "$out")" \
|| warn "x86_64 ELF cross-compile failed"
chmod +x "$out" 2>/dev/null || true
}
# ——————————————————————————————————————————————
# Compile one target across all available platforms
# ——————————————————————————————————————————————
compile_target() {
local name="$1"
local src="$SRC_DIR/${name}.c"
local out_base="$BIN_DIR/$name"
if [ ! -f "$src" ]; then
warn "source not found: $src — skipping $name"
return 0
fi
say "Compiling $name"
if [ "$OS_NATIVE" = "Darwin" ]; then
compile_macos "$src" "$out_base"
fi
compile_elf_docker "$src" "${out_base}-x86_64-elf"
}
# ——————————————————————————————————————————————
# Main
# ——————————————————————————————————————————————
case "${1:-}" in
--clean|clean)
say "Removing all compiled binaries"
rm -rf "$BIN_DIR"
mkdir -p "$BIN_DIR"
;;
--list|list)
say "Available targets:"
echo " pico2022-buffer-overflow-0 — picoCTF 2022 CWE-121"
echo " pico2023-vne-arm64 — picoCTF 2023 ARM64 RE"
echo " vuln-demo — custom CWE-121/CWE-134/CWE-416"
echo ""
echo "Binaries in $BIN_DIR:"
ls -lh "$BIN_DIR" 2>/dev/null || echo " (none yet — run ./fetch.sh)"
;;
*)
echo "=== Fold CTF Challenge Binary Compiler ==="
echo "Platform: $(uname -m) / $(uname -s)"
echo ""
compile_target "pico2022-buffer-overflow-0"
compile_target "pico2023-vne-arm64"
compile_target "vuln-demo"
echo ""
echo "=== Done ==="
echo "Binaries in $BIN_DIR:"
ls -lh "$BIN_DIR" 2>/dev/null || echo " (none)"
;;
esac