feat: challenge registry-driven platform + XVI/XVII imports + admin toggle + domain rename
- Rename repo/domain: attack-defense-platform / attackdefense.imrnes.team (all refs replaced)
- challenge_registry.json: single source of truth (28 challs across gemastik18/xvi/xvii)
- teams.py: registry-driven CHALLENGES, set_challenge_enabled, sync_challenge_runtime
(apply enable/disable to live teams: build/up or stop/remove + receiver restart)
- compose_gen.py: render per-team compose from canonical per-challenge templates
(image reuse, per-team ports 30xxx, flag mounts, passwords)
- gen_canonical_composes.py: canonical docker-compose.yml for all services
- import_new_challenges.py: import XVI/XVII services + EOL base image fixes
(debian:buster→bookworm, node:14→20, python:3.7-slim→3.11)
- receiver: xvi package (10 checkers) + xvii package (12 generic checkers),
Challenge base reads PASSWORD_<team_port> from env; gen_receiver_main.py
generates per-team main.py from registry
- main.py: /api/challenges returns full registry; PATCH /api/challenges/<name>
toggles enabled + applies to live teams
- index.html: 🏗️ Challenge Manager tab (toggle per challenge, grouped by set)
- SLA bonus now dynamic (all enabled challenges, not hardcoded 6)
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
int main() {
|
||||
setbuf(stdout, NULL);
|
||||
|
||||
int choice = 0;
|
||||
int debug = 0;
|
||||
int size = 16;
|
||||
int canvas[16] = {0};
|
||||
|
||||
puts("bit-canvas @ gemastik-xvii");
|
||||
puts("1. draw");
|
||||
puts("2. clear");
|
||||
puts("3. resize");
|
||||
puts("4. admin");
|
||||
puts("5. exit");
|
||||
|
||||
while (1) {
|
||||
printf("choice? ");
|
||||
scanf("%d", &choice);
|
||||
switch (choice) {
|
||||
case 1:
|
||||
int n = 0;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
printf("how many bits? ");
|
||||
scanf("%d", &n);
|
||||
|
||||
if (n > (size * size * 2)) {
|
||||
puts("too many bits");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
printf("where x y? ");
|
||||
scanf("%d %d", &x, &y);
|
||||
bool prev = 0;
|
||||
bool next = 0;
|
||||
prev = canvas[x] >> y & 1;
|
||||
next = prev ^ 1;
|
||||
canvas[x] ^= 1 << y;
|
||||
if (debug) printf("[DEBUG] x: %d, y: %d, prev: %d, next: %d\n", x, y, prev, next);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 2:
|
||||
for (int i = 0; i < size; i++) {
|
||||
for (int j = 0; j < size * 2; j++) {
|
||||
canvas[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 3:
|
||||
printf("size? ");
|
||||
scanf("%d", &size);
|
||||
|
||||
break;
|
||||
|
||||
case 4:
|
||||
|
||||
FILE *f = fopen("/flag.txt", "r");
|
||||
|
||||
if (f == NULL) {
|
||||
puts("flag not found");
|
||||
return 1;
|
||||
}
|
||||
|
||||
char flag[43];
|
||||
char buffer[43];
|
||||
|
||||
fgets(flag, sizeof(flag), f);
|
||||
fclose(f);
|
||||
|
||||
printf("password? ");
|
||||
scanf("%s", buffer);
|
||||
|
||||
if (!strcmp(buffer, flag)) {
|
||||
debug = 1;
|
||||
puts("debug mode enabled");
|
||||
} else {
|
||||
puts("invalid password");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 5:
|
||||
puts("bye");
|
||||
return 0;
|
||||
|
||||
default:
|
||||
printf("invalid choice %d\n", choice);
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
for (int j = 0; j < size * 2; j++) {
|
||||
printf("%d", canvas[i] >> j & 1);
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user