Working p2, eliminate 00admin

This required a fair amount of shuffling stuff around, as can be seen.
Fortunately, now things ought to be able to run more or less standalone
again.

I also figured out a way to have the build system be a tad smarter about
not rebuilding shared stuff, although you still install the exact same eris
binary and /service subdirs for mcp and p2.  But at least you only have to
change one place in the source code now.
This commit is contained in:
Neale Pickett 2012-06-12 18:25:32 -06:00
parent af554eb3e6
commit 78a67e9ab3
69 changed files with 383 additions and 445 deletions

56
go Executable file
View File

@ -0,0 +1,56 @@
#! /bin/sh -e
TYPE=p2
case ${1:-$TYPE} in
mcp)
packages='mcp net-re'
;;
router)
packages='router'
;;
p2)
packages='p2 sequence'
;;
p2cli)
packages='p2client'
;;
esac
PATH=$HOME/src/buildroot/output/host/usr/bin:$PATH
for arch in arm i386; do
command -v ${arch}-linux-cc && ARCH=${arch}-linux export ARCH
done
if [ -z "$ARCH" ]; then
echo "I can't find a cross-compiler."
exit 1
fi
make -C $HOME/src/puzzles
make -C $HOME/src/ctf
for p in $packages; do
for pd in ctf puzzles; do
pp=$HOME/src/$pd/bin/$p.pkg
[ -f $pp ] && op="$op $pp"
done
done
mksquashfs \
$op \
$HOME/ctf.squashfs -noappend
echo $ARCH
if [ $ARCH = i386-linux ]; then
lsmod | grep -q kvm-intel || sudo modprobe kvm-intel
sudo kvm \
-serial stdio \
-kernel $HOME/src/buildroot/output/images/bzImage \
-initrd $HOME/src/buildroot/output/images/rootfs.squashfs \
-append "console=ttyS0 packages=/dev/sda ipv6 debug" \
-hda $HOME/ctf.squashfs \
-net nic,model=e1000 \
-net tap,vlan=0,script=$HOME/src/ctf/qemu-ifup,downscript=/bin/true
fi

View File

@ -1,19 +0,0 @@
00ADMIN_PKGDIR = $(TARGET)/00admin
00ADMIN_BUILDDIR = $(BUILD)/00admin
ifndef PASSWORD
$(error PASSWORD not defined)
endif
00admin-build: $(00ADMIN_BUILDDIR)/build
$(00ADMIN_BUILDDIR)/build:
$(MAKE) -C packages/00admin/src
00admin-install: $(00ADMIN_BUILDDIR)/build
$(call COPYTREE, packages/00admin/service, $(00ADMIN_PKGDIR)/service)
echo "$(PASSWORD)" > $(00ADMIN_PKGDIR)/password
mkdir -p $(00ADMIN_PKGDIR)/sbin
cp packages/00admin/bin/* $(00ADMIN_PKGDIR)/bin
cp packages/00admin/src/tea $(00ADMIN_PKGDIR)/bin
PACKAGES += 00admin

View File

@ -1,34 +0,0 @@
#! /bin/sh -e
action=$1; shift
read n < ip.txt
if grep -q '/' ip.txt; then
IP=$n
elif grep -q ipv4 /proc/cmdline; then
# IPv4
IP="10.0.0.$n/16"
else
# IPv6
l=$(busybox dc 16 o $n p)
IP="fd84:b410:3441::$l/64"
fi
[ "$action" ] && ip addr $action $IP dev eth0
if [ "$action" = "add" ]; then
fail=fail
for i in $(seq 5); do
if ip addr | grep -v tentative | grep -Fq $IP; then
fail=
break
fi
sleep 1
done
[ "$fail" ] && return 1
fi
[ "$action" = del ] || echo $IP

View File

@ -1,3 +0,0 @@
all: tea
clean:
rm -f tea

View File

@ -0,0 +1,5 @@
This directory is for things that multiple packages need.
For example, eris httpd is used by mcp, p2, and inferno.
This directory does not create its own package, though.

View File

@ -0,0 +1,27 @@
ifndef PASSWORD
$(error PASSWORD not defined)
endif
TEA_BIN = packages/00common/src/tea
POINTSCLI_BIN = packages/00common/src/pointscli
PUZZLES_BIN = packages/00common/src/puzzles.cgi
.PHONY: ctfbase
ctfbase: $(TEA_BIN) $(POINTSCLI_BIN) $(PUZZLES_BIN)
$(TEA_BIN) $(POINTSCLI_BIN) $(PUZZLES_BIN):
$(MAKE) -C $(@D)
packages-clean: ctfbase-clean
ctfbase-clean:
$(MAKE) -C packages/00common/src clean
define CTFBASE_INSTALL
$(call COPYTREE, packages/00common/service, $1/service)
mkdir -p $(1)/bin
cp $(TEA_BIN) $(1)/bin
cp $(POINTSCLI_BIN) $(1)/bin
cp $(PUZZLES_BIN) $(1)/bin
echo "$(PASSWORD)" > $(1)/password
endef

View File

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 247 B

View File

@ -0,0 +1,21 @@
#! /bin/sh
# Use first installed binary
for bin in /opt/*/bin/$1; do
if [ -x $bin ]; then
exec $bin
fi
done
cat <<EOD
<!DOCTYPE html>
<html>
<head>
<title>$1</title>
</head>
<body>
<h1>$1</h1>
<p>No $1 binary installed!</p>
</body>
</html>
EOD

View File

@ -0,0 +1,43 @@
#! /bin/sh -e
fn=$2/$3
WWW=${CTF_BASE:-/var/www}
BASE=${CTF_BASE:-/var/lib/ctf}
OPT=${CTF_BASE:-/opt}
POINTS=$BASE/points.log
BACKUP=$WWW/backup.png
SCOREBOARD=$WWW/scoreboard.html
PUZZLES=$WWW/puzzles.html
# Only do this if this score hasn't yet been recorded
if [ -n "$(sort -k2 $POINTS $fn | uniq -f1 -d)" ]; then
exit
fi
# Append point. pointsd is called serially from inotify,
# so we don't need to lock it.
cat $fn >> $POINTS
rm $fn
# Generate new backup if we can find a password file
for pwfile in $OPT/*/password; do
if [ -f $pwfile ]; then
(
cat bkup.png
tar cvf - $BASE | gzip -c | $OPT/*/bin/tea 3< $pwfile
) > $BACKUP.new
mv $BACKUP.new $BACKUP
break
fi
done
# Render scoreboard
./mkpage scoreboard < $POINTS > $SCOREBOARD.new
mv $SCOREBOARD.new $SCOREBOARD
# Render puzzles list
./mkpage puzzles.cgi > $PUZZLES.new
mv $PUZZLES.new $PUZZLES

View File

@ -0,0 +1,49 @@
#! /bin/sh -e
exec 2>&1
: ${CTF_BASE:=/var/lib/ctf}
install -d $CTF_BASE
# Create CTF and nobody users
touch /etc/group /etc/passwd
addgroup -g 65534 nogroup || true
adduser -DH -G nogroup -u 65534 nobody || true
adduser -DHS ctf || true
# Set up base directories
NEWDIR=$CTF_BASE/points.new
TMPDIR=$CTF_BASE/points.tmp
install -d /var/www
install -d /var/lib/ctf
install -o ctf -m 0755 -d $NEWDIR
install -o ctf -m 0755 -d $TMPDIR
# Create some files
touch /var/lib/ctf/points.log
# Generate preliminary scoreboard
if [ ! -f /var/www/scoreboard.html ]; then
./mkpage scoreboard < /dev/null > /var/www/scoreboard.html
fi
# Generate preliminary puzzles list
if [ ! -f /var/www/puzzles.html ]; then
./mkpage puzzles.cgi > /var/www/puzzles.html
fi
# Run pointsd every time a new points file is dropped
if [ -x /sbin/inotifyd ]; then
exec /sbin/inotifyd ./pointsd $NEWDIR:y
fi
# Simulate inotifyd by polling
cd $NEWDIR
while true; do
find . -type f | while read fn; do
./pointsd m $NEWDIR ${fn#./}
done
sleep 7
done

View File

@ -2,7 +2,10 @@
exec 2>&1
read password < /opt/00admin/password
password='grape guts'
for fn in /opt/*/password; do
read password < $fn && break
done
printf 'root:%s' "$password" | chpasswd --md5

View File

@ -1,12 +1,12 @@
CFLAGS = -Wall -Werror
TARGETS = claim.cgi puzzler.cgi puzzles.cgi
TARGETS += pointscli
TARGETS = claim.cgi puzzler.cgi puzzles.cgi pointscli
TARGETS += tea bubblebabble
all: build
build: $(TARGETS)
pointscli: pointscli.o common.o
pointscli: common.o
puzzles.cgi: puzzles.cgi.o common.o
claim.cgi: claim.cgi.o common.o
@ -14,4 +14,3 @@ puzzler.cgi: puzzler.cgi.o common.o
clean:
rm -f $(TARGETS) *.o

View File

@ -0,0 +1,54 @@
#include <stdio.h>
#include <sysexits.h>
/** Compute bubble babble for input buffer.
*
* The generated output will be of length 6*((inlen/2)+1), including the
* trailing NULL.
*
* Test vectors:
* `' (empty string) `xexax'
* `1234567890' `xesef-disof-gytuf-katof-movif-baxux'
* `Pineapple' `xigak-nyryk-humil-bosek-sonax'
*/
static char const consonants[] = "bcdfghklmnprstvz";
static char const vowels[] = "aeiouy";
int
main(int argc, char *argv[])
{
int seed = 1;
putchar('x');
while (1) {
int c;
c = getchar();
if (EOF == c) {
putchar(vowels[seed % 6]);
putchar('x');
putchar(vowels[seed / 6]);
break;
}
putchar(vowels[(((c >> 6) & 3) + seed) % 6]);
putchar(consonants[(c >> 2) & 15]);
putchar(vowels[((c & 3) + (seed / 6)) % 6]);
seed = (seed * 5) + (c * 7);
c = getchar();
seed = (seed + c) % 36;
if (EOF == c) {
break;
}
putchar(consonants[(c >> 4) & 15]);
putchar('-');
putchar(consonants[c & 15]);
}
putchar('x');
putchar('\n');
return 0;
}

View File

@ -59,7 +59,7 @@ main(int argc, char *argv[])
}
{
FILE *f = fopen(state_path("puzzles.db"), "r");
FILE *f = fopen(state_path("points.log"), "r");
char cat[CAT_MAX];
char points_str[11];
long points;

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,6 +2,6 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
exec setuidgid nobody /opt/cowbull/bin/cowd < /opt/cowbull/tokens.txt

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,6 +2,6 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
exec tcpsvd -u nobody ${IP%/*} 1013 ./go

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
adduser -S -H -u 65534 nobody
adduser -S -H irc

View File

@ -1,90 +0,0 @@
diff -Naur fnord-1.10-orig//httpd.c fnord-1.10/httpd.c
--- fnord-1.10-orig//httpd.c 2005-08-03 05:32:50.000000000 -0600
+++ fnord-1.10/httpd.c 2011-03-14 17:05:57.000000000 -0600
@@ -163,9 +163,8 @@
#define MAXHEADERLEN 8192
-char* remote_ip;
+char* remote_addr;
#ifdef CGI
-char* remote_port;
char* remote_ident;
#endif
@@ -186,7 +185,7 @@
time_t t=time(0);
struct tm* x=localtime(&t);
int l=-(timezone/60);
- buffer_puts(buffer_2,remote_ip?remote_ip:"0.0.0.0");
+ buffer_puts(buffer_2,remote_addr?remote_addr:"0.0.0.0");
buffer_puts(buffer_2," - - [");
buffer_put2digits(buffer_2,x->tm_mday);
@@ -219,7 +218,7 @@
buffer_putrange(buffer_2,len);
#else
- buffer_puts(buffer_2,remote_ip?remote_ip:"0.0.0.0");
+ buffer_puts(buffer_2,remote_addr?remote_addr:"0.0.0.0");
buffer_putspace(buffer_2);
buffer_putulong(buffer_2,retcode);
buffer_putspace(buffer_2);
@@ -271,7 +270,6 @@
"REQUEST_URI=",
"SCRIPT_NAME=",
"REMOTE_ADDR=",
- "REMOTE_PORT=",
"REMOTE_IDENT=",
"HTTP_USER_AGENT=",
"HTTP_COOKIE=",
@@ -337,17 +335,10 @@
*tmp=0; ++tmp;
i=7;
- if (remote_ip) {
+ if (remote_addr) {
cgi_env[++i]=tmp;
tmp+=str_copy(tmp,"REMOTE_ADDR=");
- tmp+=str_copy(tmp,remote_ip);
- *tmp=0; ++tmp;
- }
-
- if (remote_port) {
- cgi_env[++i]=tmp;
- tmp+=str_copy(tmp,"REMOTE_PORT=");
- tmp+=str_copy(tmp,remote_port);
+ tmp+=str_copy(tmp,remote_addr);
*tmp=0; ++tmp;
}
@@ -663,8 +654,9 @@
static char* mimetype="text/plain";
static struct mimeentry { const char* name, *type; } mimetab[] = {
- { "html", "text/html" },
- { "htm", "text/html" },
+ { "html", "text/html; charset=utf-8" },
+ { "htm", "text/html; charset=utf-8" },
+ { "txt", "text/plain; charset=utf-8" },
{ "css", "text/css" },
{ "dvi", "application/x-dvi" },
{ "ps", "application/postscript" },
@@ -1060,16 +1052,7 @@
static void get_ucspi_env(void) {
char* ucspi=getenv("PROTO");
if (ucspi) {
- char* buf=alloca(str_len(ucspi)+20);
- unsigned int tmp=str_copy(buf,ucspi);
- buf[tmp+str_copy(buf+tmp,"REMOTEIP")]=0;
- remote_ip=getenv(buf);
-#ifdef CGI
- buf[tmp+str_copy(buf+tmp,"REMOTEPORT")]=0;
- remote_port=getenv(buf);
- buf[tmp+str_copy(buf+tmp,"REMOTEINFO")]=0;
- remote_ident=getenv(buf);
-#endif
+ remote_addr=getenv("REMOTEADDR");
}
}

View File

@ -1,36 +1,21 @@
MCP_PKGDIR = $(TARGET)/mcp
MCP_BUILDDIR = $(BUILD)/mcp
mcp-source: $(MCP_BUILDDIR)/source
$(MCP_BUILDDIR)/source:
mkdir -p $(@D)
touch $@
mcp-build: $(MCP_BUILDDIR)/build
$(MCP_BUILDDIR)/build: $(MCP_BUILDDIR)/source
$(MAKE) -C packages/mcp/src build
mcp-install: $(MCP_BUILDDIR)/build eris
mcp-install: eris ctfbase
mkdir -p $(MCP_PKGDIR)
$(call CTFBASE_INSTALL, $(MCP_PKGDIR))
$(call COPYTREE, packages/mcp/bin, $(MCP_PKGDIR)/bin)
cp packages/mcp/src/pointscli $(MCP_PKGDIR)/bin/
cp packages/mcp/src/puzzles.cgi $(MCP_PKGDIR)/bin/
cp packages/mcp/src/tea $(MCP_PKGDIR)/bin/
cp $(ERIS_BIN) $(MCP_PKGDIR)/bin/
$(call COPYTREE, packages/mcp/service, $(MCP_PKGDIR)/service)
$(call COPYTREE, packages/mcp/www, $(MCP_PKGDIR)/www)
cp packages/mcp/src/puzzler.cgi $(MCP_PKGDIR)/www/
cp packages/mcp/src/claim.cgi $(MCP_PKGDIR)/www/
cp packages/00common/src/puzzler.cgi $(MCP_PKGDIR)/www/
cp packages/00common/src/claim.cgi $(MCP_PKGDIR)/www/
mcp-test: mcp-build
packages/mcp/test.sh
mcp-clean:
rm -rf $(MCP_PKGDIR) $(MCP_BUILDDIR)
$(MAKE) -C packages/mcp/src clean
PACKAGES += mcp

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
hostname mcp

View File

@ -1,31 +0,0 @@
#! /bin/sh -e
fn=$2/$3
WWW=${CTF_BASE:-/var/www}
BASE=${CTF_BASE:-/var/lib/ctf}
OPT=${CTF_BASE:-/opt}
POINTS=$BASE/points.log
BACKUP=$WWW/backup.png
SCOREBOARD=$WWW/scoreboard.html
# Only do this if this score hasn't yet been recorded
if [ -z "$(sort -k2 $POINTS $fn | uniq -f1 -d)" ]; then
cat $fn >> $POINTS
rm $fn
fi
if [ $POINTS -nt $SCOREBOARD ]; then
# Generate new backup
(
cat bkup.png;
tar cvf - $BASE | gzip -c | $OPT/00admin/bin/tea 3< $OPT/00admin/password
) > $BACKUP.new
mv $BACKUP.new $BACKUP
# Render scoreboard
/opt/mcp/bin/scoreboard < $POINTS > $SCOREBOARD.new
mv $SCOREBOARD.new $SCOREBOARD
fi

View File

@ -1,44 +0,0 @@
#! /bin/sh -e
exec 2>&1
install -d /var/lib/ctf
# Create CTF and nobody users
touch /etc/group /etc/passwd
addgroup -g 65534 nogroup || true
adduser -D -S -h /var/lib/ctf -H ctf || true
adduser -D -g nogroup -u 65534 -h /tmp -H nobody || true
# Set up base directories
NEWDIR=/var/lib/ctf/points.new
install -d /var/www
install -d /var/lib/ctf
install -o ctf -m 0755 -d $NEWDIR
install -o ctf -m 0755 -d /var/lib/ctf/points.tmp
# Create some files
CLAIM=/var/lib/ctf/claim.db
touch $CLAIM
chown ctf $CLAIM
touch /var/lib/ctf/points.log
# Generate preliminary scoreboard
if ! [ -f /var/www/scoreboard.html ]; then
/opt/mcp/bin/scoreboard < /dev/null > /var/www/scoreboard.html
fi
if [ -x /sbin/inotifyd ]; then
exec /sbin/inotifyd ./pointsd $NEWDIR:y
fi
# Simulate inotifyd
cd $NEWDIR
while true; do
for fn in *; do
[ -f "$fn" ] || continue
./pointsd m $NEWDIR $fn
done
sleep 7
done

View File

@ -1,5 +0,0 @@
#! /bin/sh
PUZZLES=/var/www/puzzles.html
/opt/mcp/bin/puzzles.cgi > $PUZZLES.new && mv $PUZZLES.new $PUZZLES

View File

@ -1,15 +0,0 @@
#! /bin/sh -e
exec 2>&1
install -d /var/www
# Install truncates files
DB=/var/lib/ctf/puzzles.db
touch $DB
chown ctf $DB
# Make an initial listing
./puzzled
exec inotifyd ./puzzled ${DB}:w

View File

@ -1,40 +0,0 @@
#ifndef __ARC4_H__
#define __ARC4_H__
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#define ARC4_KEYLEN 256
struct arc4_ctx {
uint8_t S[256];
uint8_t i;
uint8_t j;
};
/* Stream operations */
ssize_t
arc4_encrypt_stream(FILE *out, FILE *in,
const uint8_t *key, size_t keylen);
ssize_t
arc4_decrypt_stream(FILE *out, FILE *in,
const uint8_t *key, size_t keylen);
/* Auto-seeding Psuedo Random Number Generator */
void arc4_rand_seed(const uint8_t *seed, size_t seedlen);
uint8_t arc4_rand8();
uint32_t arc4_rand32();
/* Low-level operations */
void arc4_init(struct arc4_ctx *ctx, const uint8_t *key, size_t keylen);
uint8_t arc4_out(struct arc4_ctx *ctx);
void arc4_crypt(struct arc4_ctx *ctx,
uint8_t *obuf, const uint8_t *ibuf, size_t buflen);
void arc4_crypt_buffer(const uint8_t *key, size_t keylen,
uint8_t *buf, size_t buflen);
void arc4_nonce(uint8_t *nonce, size_t noncelen, void *seed, size_t seedlen);
#endif

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,6 +2,6 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
exec setuidgid ctf /opt/multicaster/bin/multicaster ff15::62c 1580 </opt/multicaster/tokens.txt

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip)
IP=$(dbip -p ../octopus/ip.txt)
sv s octopus >/dev/null || exit 1
exec tcpsvd ${IP%/*} 8888 ./octopus-redirect

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
grep -q ipv4 /proc/cmdline && IP=::ffff:$IP

View File

@ -1,15 +1,7 @@
#! /bin/sh
: ${BASE:=/var/lib/ctf/p2}
mkdir -p $BASE
if ! [ -f $BASE/salt ]; then
dd if=/dev/urandom count=1 | md5sum - > $BASE/salt
fi
clear
printf '\017'
read salt < $BASE/salt
: ${CTF_BASE:=/var/lib/ctf}
BASE=$CTF_BASE/teams
esc () {
printf '%s' "$*" | sed 's/[^-0-9A-Za-z ]/_/g; s/ /+/g'
@ -28,14 +20,12 @@ newteam () {
fi
hash=$(printf '%s %s' "$salt" "$name" | md5sum | cut -b 1-8)
if [ -d $BASE/$hash ]; then
if [ -f $BASE/names/$hash ]; then
echo "That name is already in use. Try another one."
return
fi
mkdir $BASE/$hash
printf '%s' "$name" > $BASE/$hash/.name
printf '%s' "$name" > $BASE/names/$hash
cat <<EOD
Your team hash is $hash. Write that down somewhere and don't lose it.
@ -51,7 +41,15 @@ fini () {
exit 0
}
echo -n 'Team hash ("new" to create a new team): '
log () {
awk -v H=$1 '($2 == H) { print($3, $4); }' $CTF_BASE/points.log
}
clear
read salt < $BASE/salt
printf '\017Team hash ("new" to create a new team): '
read -r hash
echo
if [ -z "$hash" ]; then
@ -59,15 +57,18 @@ if [ -z "$hash" ]; then
elif [ "$hash" = "new" ]; then
newteam
fini
elif ! [ -d $BASE/$hash ]; then
elif [ "$hash" = 58 ]; then
name='Thumper Bumper'
elif ! [ -f $BASE/names/$hash ]; then
echo "No such team, fool."
echo "Is this when everybody laughs at you for forgetting your hash?"
fini
else
read -r name < $BASE/names/$hash
fi
clear
read -r name < $BASE/$hash/.name
printf 'Welcome back, %s.\n' "$name"
@ -81,7 +82,8 @@ while true; do
 Help
----------------------------------------------------------
Type "quit" to leave the p2 shell.
Type quit to leave the p2 shell.
Type log to show answered puzzles.
Any other string is checked as an answer. If the answer
is correct, you are awarded points and the scoreboard will
@ -90,6 +92,14 @@ see if your answer unlocked a new puzzle.
EOD
continue
;;
log)
cat <<EOD
Puzzles Answered By $name
---------------------------------------
EOD
log $hash
continue
;;
quit)
break
;;
@ -104,13 +114,12 @@ EOD
cat=${match% *}
points=${match#* }
fn=$BASE/$hash/$cat.$points
if [ -f $fn ]; then
if log $hash | grep -Fxq "$cat $points"; then
echo "You've already received points for this answer."
else
> $fn
elif pointscli $hash $cat $points p2console; then
echo "You get $points more points in the $cat category."
# run puzzles.cgi
# update scoreboard
else
echo "Error recording points. Tell the officials!"
fi
done

25
packages/p2/p2.mk Normal file
View File

@ -0,0 +1,25 @@
P2_PKGDIR = $(TARGET)/p2
p2-build: packages/p2/src/modem
packages/p2/src/modem:
$(MAKE) -C packages/p2/src
p2-install: packages/p2/src/modem eris ctfbase
mkdir -p $(P2_PKGDIR)
$(call CTFBASE_INSTALL, $(P2_PKGDIR))
$(call COPYTREE, packages/p2/bin, $(P2_PKGDIR)/bin)
cp $(ERIS_BIN) $(P2_PKGDIR)/bin/
cp packages/p2/src/modem $(P2_PKGDIR)/bin/
$(call COPYTREE, packages/p2/service, $(P2_PKGDIR)/service)
$(call COPYTREE, packages/mcp/www, $(P2_PKGDIR)/www)
p2-clean:
$(MAKE) -C packages/p2/src
PACKAGES += p2

View File

@ -1,3 +0,0 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del

View File

@ -2,12 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
addgroup -g 65534 nogroup || true
adduser -D -g nogroup -u 65534 -h /tmp -H nobody || true
hostname p2
IP=$(dbip -p ../p2console/ip.txt)
# Link in puzzles and web pages
install -d /var/www

View File

@ -0,0 +1,3 @@
#! /bin/sh
dbip -d

View File

@ -0,0 +1,5 @@
#! /bin/sh
while true; do
/opt/p2/bin/p2console
done | /opt/p2/bin/modem

View File

@ -0,0 +1,15 @@
#! /bin/sh -e
exec 2>&1
hostname p2
IP=$(dbip -a)
install -d /var/lib/ctf/teams
install -o ctf -m 0755 -d /var/lib/ctf/teams/names
if ! [ -f /var/lib/ctf/teams/salt ]; then
dd if=/dev/urandom count=1 | md5sum - > /var/lib/ctf/teams/salt
fi
exec setuidgid ctf tcpsvd 0 5555 ./p2console

View File

@ -1,31 +0,0 @@
#! /bin/sh -e
fn=$2/$3
WWW=${CTF_BASE:-/var/www}
BASE=${CTF_BASE:-/var/lib/ctf}
OPT=${CTF_BASE:-/opt}
POINTS=$BASE/points.log
BACKUP=$WWW/backup.png
SCOREBOARD=$WWW/scoreboard.html
# Only do this if this score hasn't yet been recorded
if [ -z "$(sort -k2 $POINTS $fn | uniq -f1 -d)" ]; then
cat $fn >> $POINTS
rm $fn
fi
if [ $POINTS -nt $SCOREBOARD ]; then
# Generate new backup
(
cat bkup.png;
tar cvf - $BASE | gzip -c | $OPT/00admin/bin/tea 3< $OPT/00admin/password
) > $BACKUP.new
mv $BACKUP.new $BACKUP
# Render scoreboard
/opt/p2/bin/scoreboard < $POINTS > $SCOREBOARD.new
mv $SCOREBOARD.new $SCOREBOARD
fi

View File

@ -1,44 +0,0 @@
#! /bin/sh -e
exec 2>&1
install -d /var/lib/ctf
# Create CTF and nobody users
touch /etc/group /etc/passwd
addgroup -g 65534 nogroup || true
adduser -D -S -h /var/lib/ctf -H ctf || true
adduser -D -g nogroup -u 65534 -h /tmp -H nobody || true
# Set up base directories
NEWDIR=/var/lib/ctf/points.new
install -d /var/www
install -d /var/lib/ctf
install -o ctf -m 0755 -d $NEWDIR
install -o ctf -m 0755 -d /var/lib/ctf/points.tmp
# Create some files
CLAIM=/var/lib/ctf/claim.db
touch $CLAIM
chown ctf $CLAIM
touch /var/lib/ctf/points.log
# Generate preliminary scoreboard
if ! [ -f /var/www/scoreboard.html ]; then
/opt/mcp/bin/scoreboard < /dev/null > /var/www/scoreboard.html
fi
if [ -x /sbin/inotifyd ]; then
exec /sbin/inotifyd ./pointsd $NEWDIR:y
fi
# Simulate inotifyd
cd $NEWDIR
while true; do
for fn in *; do
[ -f "$fn" ] || continue
./pointsd m $NEWDIR $fn
done
sleep 7
done

View File

@ -1,4 +1,4 @@
all: modem tea
all: modem
clean:
rm -f modem tea
rm -f modem

View File

@ -2,7 +2,7 @@
/**** Color Scheme ****/
html {
background: #112 url(smoke.jpg) no-repeat;
background: #112 url(p2inv.jpg) no-repeat;
background-size: contain;
}

View File

@ -15,9 +15,6 @@
<li>
<a href="puzzles.html">Puzzles</a>
</li>
<li>
<a href="news.html">News</a>
</li>
<li>
<a href="scoring.html">About scoring</a>
</li>

View File

@ -1,11 +1,13 @@
#! /bin/sh
# Try hard to look like a serial connection
# Try hard to look like a serial terminal
reset
# Maybe this is some startup code
sleep 0.4
# Print some bullshit to confuse people
printf 'RS232/0:1200-N81 '
printf 'S0:1200N81 '
# Simulate a green-phosphor CRT
printf '\033]P0111122\033]P788ff00\033]Pfff8800'

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
ip addr add $IP dev eth0 || true
exec tcpsvd -u nobody ${IP%/*} 1013 /opt/playfair/bin/playfair

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
# So I say to him, "Alex, what's a good high port number for a CTF category?"
# And he says, "6"

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
exec tcpsvd -u nobody ${IP%/*} 1013 ./go

View File

@ -1,3 +1,3 @@
#! /bin/sh
/opt/00admin/bin/fire-ip del
dbip -d

View File

@ -2,7 +2,7 @@
exec 2>&1
IP=$(/opt/00admin/bin/fire-ip add)
IP=$(dbip -a)
dir=/var/lib/ctf/rlyeh
install -o nobody -d $dir

5
qemu-ifup Executable file
View File

@ -0,0 +1,5 @@
#! /bin/sh
ip addr add fd84:b410:3441::ffff/64 dev $1
ip addr add 10.0.0.254/24 dev $1