From 8c66e0800900557c914b6581a0bb1aed4b582646 Mon Sep 17 00:00:00 2001 From: Neale Pickett Date: Fri, 18 Mar 2011 21:57:12 -0600 Subject: [PATCH] Start moving pwnables to new token encryption --- packages/ctfbase/ctfbase.mk | 1 - packages/ctfbase/src/Makefile | 8 +++---- packages/ctfbase/src/arc4.c | 2 +- packages/ctfbase/src/arc4.h | 2 +- packages/pwnables/src/Makefile | 10 ++++---- packages/pwnables/src/arc4.c | 1 + packages/pwnables/src/arc4.h | 1 + packages/pwnables/src/gimmie.c | 18 +++++---------- packages/pwnables/src/token.c | 42 ++++++++++++++++++++++++++++++++++ packages/pwnables/src/token.h | 15 ++++++++++++ src/arc4.c | 22 ++++++++---------- 11 files changed, 85 insertions(+), 37 deletions(-) create mode 120000 packages/pwnables/src/arc4.c create mode 120000 packages/pwnables/src/arc4.h create mode 100644 packages/pwnables/src/token.c create mode 100644 packages/pwnables/src/token.h diff --git a/packages/ctfbase/ctfbase.mk b/packages/ctfbase/ctfbase.mk index 8b89e09..30611cb 100644 --- a/packages/ctfbase/ctfbase.mk +++ b/packages/ctfbase/ctfbase.mk @@ -5,7 +5,6 @@ ctfbase-install: ctfbase-build $(call COPYTREE, packages/ctfbase/service, $(CTFBASE_PKGDIR)/service) - cp packages/ctfbase/src/tokencli $(CTFBASE_PKGDIR)/bin/ cp packages/ctfbase/src/arc4 $(CTFBASE_PKGDIR)/bin/ ctfbase-clean: diff --git a/packages/ctfbase/src/Makefile b/packages/ctfbase/src/Makefile index 5b21ecc..b0d4010 100644 --- a/packages/ctfbase/src/Makefile +++ b/packages/ctfbase/src/Makefile @@ -1,9 +1,7 @@ -build: tokencli arc4 +build: arc4 arc4: arc4.c - $(CC) $(CFLAGS) $(LDFLAGS) -DARC4_MAIN -o $@ $< - -tokencli: tokencli.o arc4.o +arc4: CFLAGS += -DARC4_MAIN clean: - rm -f *.o tokencli arc4 + rm -f *.o arc4 diff --git a/packages/ctfbase/src/arc4.c b/packages/ctfbase/src/arc4.c index 0c6a48f..4dcde89 120000 --- a/packages/ctfbase/src/arc4.c +++ b/packages/ctfbase/src/arc4.c @@ -1 +1 @@ -../../../include/arc4.c \ No newline at end of file +../../../src/arc4.c \ No newline at end of file diff --git a/packages/ctfbase/src/arc4.h b/packages/ctfbase/src/arc4.h index d102bb2..a5d8c7a 120000 --- a/packages/ctfbase/src/arc4.h +++ b/packages/ctfbase/src/arc4.h @@ -1 +1 @@ -../../../include/arc4.h \ No newline at end of file +../../../src/arc4.h \ No newline at end of file diff --git a/packages/pwnables/src/Makefile b/packages/pwnables/src/Makefile index 245bcba..6f2454d 100644 --- a/packages/pwnables/src/Makefile +++ b/packages/pwnables/src/Makefile @@ -5,11 +5,11 @@ all: build build: $(TARGETS) -gimmie: gimmie.o token.o -octopus: octopus.o token.o -ltraceme: ltraceme.o token.o -straceme: straceme.o token.o -killme: killme.o token.o +gimmie: gimmie.o token.o arc4.o +octopus: octopus.o token.o arc4.o +ltraceme: ltraceme.o token.o arc4.o +straceme: straceme.o token.o arc4.o +killme: killme.o token.o arc4.o install: $(TARGETS) install -m 0755 $(TARGETS) $(DESTDIR)/bin diff --git a/packages/pwnables/src/arc4.c b/packages/pwnables/src/arc4.c new file mode 120000 index 0000000..4dcde89 --- /dev/null +++ b/packages/pwnables/src/arc4.c @@ -0,0 +1 @@ +../../../src/arc4.c \ No newline at end of file diff --git a/packages/pwnables/src/arc4.h b/packages/pwnables/src/arc4.h new file mode 120000 index 0000000..a5d8c7a --- /dev/null +++ b/packages/pwnables/src/arc4.h @@ -0,0 +1 @@ +../../../src/arc4.h \ No newline at end of file diff --git a/packages/pwnables/src/gimmie.c b/packages/pwnables/src/gimmie.c index c0e322b..fe7fbd8 100644 --- a/packages/pwnables/src/gimmie.c +++ b/packages/pwnables/src/gimmie.c @@ -1,4 +1,7 @@ +#include #include +#include +#include #include "token.h" uint8_t const key[] = {0x5f, 0x64, 0x13, 0x29, @@ -9,19 +12,10 @@ uint8_t const key[] = {0x5f, 0x64, 0x13, 0x29, int main(int argc, char *argv[]) { - char token[200]; - ssize_t tokenlen; - - tokenlen = read_token("gimmie", - key, sizeof(key), - token, sizeof(token) - 1); - if (-1 == tokenlen) { - write(1, "Something is broken\nI can't read my token.\n", 43); - return 69; + if (-1 == print_token("gimmie", key, sizeof(key))) { + fprintf(stderr, "Something is broken; I can't read my token.\n"); + return EX_UNAVAILABLE; } - token[tokenlen++] = '\n'; - write(1, token, tokenlen); - return 0; } diff --git a/packages/pwnables/src/token.c b/packages/pwnables/src/token.c new file mode 100644 index 0000000..9b29df0 --- /dev/null +++ b/packages/pwnables/src/token.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include "token.h" +#include "arc4.h" + +#ifndef CTF_BASE +#define CTF_BASE "/var/lib/ctf" +#endif + +ssize_t +write_token(FILE *out, + const char *name, + const uint8_t *key, size_t keylen) +{ + char *base; + char path[PATH_MAX]; + int pathlen; + FILE *f; + ssize_t ret; + + base = getenv("CTF_BASE"); + if (! base) base = CTF_BASE; + + pathlen = snprintf(path, sizeof(path) - 1, + "%s/tokens/%s", base, name); + path[pathlen] = '\0'; + + f = fopen(path, "r"); + if (NULL == f) return -1; + ret = arc4_decrypt_stream(out, f, key, keylen); + fclose(f); + + return ret; +} + +ssize_t +print_token(const char *name, + const uint8_t *key, size_t keylen) +{ + return write_token(stdout, name, key, keylen); +} diff --git a/packages/pwnables/src/token.h b/packages/pwnables/src/token.h new file mode 100644 index 0000000..7eb6167 --- /dev/null +++ b/packages/pwnables/src/token.h @@ -0,0 +1,15 @@ +#ifndef __TOKEN_H__ +#define __TOKEN_H__ + +#include +#include +#include + +ssize_t write_token(FILE *out, + const char *name, + const uint8_t *key, size_t keylen); +ssize_t print_token(const char *name, + const uint8_t *key, size_t keylen); + + +#endif diff --git a/src/arc4.c b/src/arc4.c index 611e129..471b503 100644 --- a/src/arc4.c +++ b/src/arc4.c @@ -159,11 +159,11 @@ arc4_decrypt_stream(FILE *out, FILE *in, char sig[4]; int i; - fread(&sig, sizeof(sig), 1, stdin); + fread(&sig, sizeof(sig), 1, in); if (memcmp(sig, "arc4", 4)) { return -1; } - fread(&seed, sizeof(seed), 1, stdin); + fread(&seed, sizeof(seed), 1, in); arc4_nonce(nonce, sizeof(nonce), &seed, sizeof(seed)); for (i = 0; i < keylen; i += 1) { @@ -191,11 +191,8 @@ arc4_decrypt_stream(FILE *out, FILE *in, int main(int argc, char *argv[]) { - struct arc4_ctx ctx; - uint8_t key[ARC4_KEYLEN] = {0}; - size_t keylen; - uint8_t nonce[ARC4_KEYLEN]; - int i; + uint8_t key[ARC4_KEYLEN] = {0}; + size_t keylen; /* Read key and initialize context */ { @@ -206,19 +203,20 @@ main(int argc, char *argv[]) memcpy(key, ekey, keylen); } else { keylen = read(3, key, sizeof(key)); + if (-1 == keylen) { + fprintf(stderr, "error: must specify key.\n"); + return 1; + } } } if (! argv[1]) { if (-1 == arc4_decrypt_stream(stdout, stdin, key, keylen)) { - perror("decrypting"); + fprintf(stderr, "error: not an arc4 stream.\n"); return 1; } } else if (0 == strcmp(argv[1], "-e")) { - if (-1 == arc4_encrypt_stream(stdout, stdin, key, keylen)) { - perror("encrypting"); - return 1; - } + arc4_encrypt_stream(stdout, stdin, key, keylen); } else { fprintf(stderr, "Usage: %s [-e]