From 3eaefc7d26b8412b9f4bd5e638fef36b09f5aeff Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Sun, 5 Mar 2017 23:58:08 -0800 Subject: [PATCH 01/14] Added Hex QR --- count.py | 3 +- qrt/description.md | 1 + qrt/flag.png | Bin 0 -> 16213 bytes qrt/grader.py | 22 ++++ qrt/problem.yml | 5 + qrt/qrt.py | 311 +++++++++++++++++++++++++++++++++++++++++++++ qrt/qrt.pyc | Bin 0 -> 8304 bytes qrt/server.py | 30 +++++ 8 files changed, 371 insertions(+), 1 deletion(-) create mode 100644 qrt/description.md create mode 100644 qrt/flag.png create mode 100644 qrt/grader.py create mode 100644 qrt/problem.yml create mode 100644 qrt/qrt.py create mode 100644 qrt/qrt.pyc create mode 100644 qrt/server.py diff --git a/count.py b/count.py index 9623aba..bf76c05 100644 --- a/count.py +++ b/count.py @@ -20,6 +20,7 @@ for problem_name in problem_names: pass # print traceback.format_exc() +problems.sort(key=lambda p: p.get("value"), reverse=True) print "Grand Total: %d" % len(problems) print "Category Breakdown:" @@ -29,4 +30,4 @@ for category, count in categories: print " %s: %s" % (category, count) for problem in problems: if problem.get("category") != category: continue - print " %s" % problem.get("title") + print " %s [%s]" % (problem.get("title"), problem.get("value")) diff --git a/qrt/description.md b/qrt/description.md new file mode 100644 index 0000000..8872c46 --- /dev/null +++ b/qrt/description.md @@ -0,0 +1 @@ +I've stumbled upon a very strange [QR code](${flag_png})... seems like it was generated with [this generator](http://hexqr.web.easyctf.com). What could it mean? \ No newline at end of file diff --git a/qrt/flag.png b/qrt/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..d03a93f550a14fcdf6b70bb8ff878d580927f119 GIT binary patch literal 16213 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 0: + return True, "Correct!" + return False, "Nope." \ No newline at end of file diff --git a/qrt/problem.yml b/qrt/problem.yml new file mode 100644 index 0000000..35df231 --- /dev/null +++ b/qrt/problem.yml @@ -0,0 +1,5 @@ +title: Hex QR +category: Programming +value: 200 +author: mzhang +autogen: true \ No newline at end of file diff --git a/qrt/qrt.py b/qrt/qrt.py new file mode 100644 index 0000000..d72640e --- /dev/null +++ b/qrt/qrt.py @@ -0,0 +1,311 @@ +from PIL import Image, ImageDraw +from math import ceil, sqrt + +ALTCONST = sqrt(3) / 2.0 +ISIZE = 784.0 +IMARGIN = 22.0 + +def empty_hex(size): + c = 0 + points = [] + for i in range(2, size * 2 + 2, 2): + points.append([0] * i) + middle = [] + for i in range(size * 2 - 1): + row = [0] * (size * 2) + middle.append(row) + epoints = list(row[:] for row in points[::-1]) + return points + middle + epoints + +def intify(points): + return map(lambda c: (int(c[0]), int(c[1])), points) + +def draw_triangle(im, points, cell, size): + draw = ImageDraw.Draw(im) + # draw.polygon(points, outline=(0, 0, 0)) + if cell: + draw.polygon(intify(points), fill=(0, 0, 0)) + return im + +def getsection(i, size): + return 0 if i <= size - 1 else (1 if i < 3 * size - 1 else 2) + +def getspace(size): + return max(0, sum(len(filter(lambda a: a == 0, b)) for b in empty_hex(size)) - 2) + +def generate(string, debug=False): + size = 0 + binstring = bin(int(string.encode("hex"), 16)).strip("0b") + while size < 2 or getspace(size + 1) < len(binstring): + size += 1 + n = getspace(size) + # print size, len(binstring) + if debug: print "SIZE", size, " n =", n + im = Image.new("RGB", (int(ISIZE), int(ISIZE)), "white") + pattern = empty_hex(size) + # print len(binstring) + # print sum(len(i) for i in pattern) + pattern[0][len(string) % 2] = 1 + curr = (1, 1 + len(string) % 2, 3 - len(string) % 2) + # 0 1 + # 3 2 + for c in range(n): # range(len(binstring)): + i, j, d = curr + row = pattern[i] + if c < len(binstring): + b = int(binstring[c]) + pattern[i][j] = b + if c % 2 == 0: + pattern[i][j] ^= 1 + + section = getsection(i, size) + leftfacing = [j % 2 == 0, j % 2 != (i - size) % 2, j % 2 == 0][section] + if debug: print "c =", c, ", i =", i, ", j =", j, ", d =", d, ", s =", section, ", l =", leftfacing + if section == 0: + if getsection(i + 1, size) == 0: + if leftfacing: + if d == 0: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j + 1, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + if j == len(row) - 1: + curr = i + 1, j + 2, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 2: + curr = i + 1, j + 1, d + elif d == 3: + curr = i, j - 1, d + elif getsection(i + 1, size) == 1: + if leftfacing: + if d == 0: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + if j == len(row) - 1: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i, j - 1, d + elif section == 1: + if getsection(i - 1, size) == 0: + if leftfacing: + if j == len(row) - 1: + if d == 1: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 2, j, (d + 2) % 4 + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i - 1, j, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if j == 0: + if d == 0: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i + 2, j, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif getsection(i - 1, size) == 1: + if getsection(i + 1, size) == 1: + if leftfacing: + if j == len(row) - 1: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 2, j, (d + 2) % 4 + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i - 1, j, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if j == 0: + if d == 0: + curr = i + 2, j, (d + 2) % 4 + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i + 2, j, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif getsection(i + 1, size) == 2: + if leftfacing: + if j == len(row) - 1: + if d == 0: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, (d + 2) % 4 + else: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i, j + 1, d + elif d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i, j - 1, d + elif section == 2: + if getsection(i - 1, size) == 1: + if leftfacing: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i, j + 1, d + elif d == 2: + curr = i, j + 1, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + if j == len(row) - 1: + curr = i + 1, j - 2, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + elif getsection(i - 1, size) == 2: + if leftfacing: + if d == 0: + curr = i - 1, j + 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + else: + if j == len(row) - 1: + if d == 0: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j + 1, d + elif d == 2: + curr = i + 1, j - 2, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j + 1, d + elif d == 2: + curr = i + 1, j - 1, d + # for i in range(len(pattern)): + # for j in range(len(pattern[i])): + # section = 0 if i <= size - 1 else (1 if i < 3 * size - 1 else 2) + # leftfacing = [j % 2 == 0, j % 2 != (i - size) % 2, j % 2 == 0][section] + # if not leftfacing: + # print j, + # print + sidelen = (ISIZE - IMARGIN * 2) / (2.0 * size) + altitude = sidelen * ALTCONST + # print sidelen, altitude + for i in range(len(pattern)): + section = getsection(i, size) + row = pattern[i] + rowleft = (ISIZE / 2) - (altitude * len(row) / 2) + if section % 2 == 0: + evenrow = i % 2 == 0 + for j in range(len(row)): + cell = row[j] + top = ceil(i / 2.0) * sidelen - (0.5 * sidelen if not evenrow else 0) + IMARGIN + bottom = top + sidelen + if j % 2 == 0: + points = [ + (rowleft + altitude * j, top + sidelen / 2), + (rowleft + altitude * (j + 1), top), (rowleft + altitude * (j + 1), bottom) + ] + else: + points = [ + (rowleft + altitude * (j + 1), top + sidelen / 2), + (rowleft + altitude * j, top), (rowleft + altitude * j, bottom) + ] + draw_triangle(im, points, cell, size) + else: + evenrow = (i - size) % 2 == 1 + for j in range(len(row)): + cell = row[j] + top = ceil(i / 2.0) * sidelen - (0.5 * sidelen if i % 2 == 1 else 0) + IMARGIN + bottom = top + sidelen + if j % 2 == (i - size) % 2: + points = [ + (rowleft + altitude * (j + 1), top + sidelen / 2), + (rowleft + altitude * j, top), (rowleft + altitude * j, bottom) + ] + else: + points = [ + (rowleft + altitude * j, top + sidelen / 2), + (rowleft + altitude * (j + 1), top), (rowleft + altitude * (j + 1), bottom) + ] + draw_triangle(im, points, cell, size) + return im + +# im = generate("easyctf{are_triangles_more_secure_than_squares?}") +# im.save("flag.png") + +# for i in range(40, 60): +# generate("A" * i, "/tmp/%d.png" % i) \ No newline at end of file diff --git a/qrt/qrt.pyc b/qrt/qrt.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02316a0bdc10cdf86b9e4a0650bc07903982a15d GIT binary patch literal 8304 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 literal 0 HcmV?d00001 diff --git a/qrt/server.py b/qrt/server.py new file mode 100644 index 0000000..51c70de --- /dev/null +++ b/qrt/server.py @@ -0,0 +1,30 @@ +from flask import Flask, request +from qrt import generate +from base64 import b64encode +from binascii import b2a_base64 +from cStringIO import StringIO +from traceback import format_exc + +app = Flask(__name__) + +@app.route("/", methods=["GET", "POST"]) +def index(): + try: + html = "hex qr
enter a string:
" + if request.method == "POST": + if not request.form.get("text"): + html %= "" + html += "

empty

" + else: + html %= request.form["text"] + im = generate(request.form["text"]) + buf = StringIO() + im.save(buf, format="JPEG") + html += "" % b2a_base64(buf.getvalue()) + else: + html %= "" + return html + except: + return "" % format_exc() + +app.run(host="0.0.0.0", port=5000) \ No newline at end of file From 9aadd225e2304f2a2b246b7ae62142e9481ef2df Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Sun, 5 Mar 2017 23:58:29 -0800 Subject: [PATCH 02/14] Ignore *.pyc --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e99e36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc \ No newline at end of file From 71a870991096ab2d32d980df883374291fb218f2 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Mon, 6 Mar 2017 00:26:11 -0800 Subject: [PATCH 03/14] Grader can't be dependent. --- qrt/grader.py | 324 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 316 insertions(+), 8 deletions(-) diff --git a/qrt/grader.py b/qrt/grader.py index f0acc68..0c8728b 100644 --- a/qrt/grader.py +++ b/qrt/grader.py @@ -1,22 +1,330 @@ from cStringIO import StringIO -from qrt import generate +from PIL import Image, ImageDraw +from math import ceil, sqrt + +ALTCONST = sqrt(3) / 2.0 +ISIZE = 784.0 +IMARGIN = 22.0 + +def empty_hex(size): + c = 0 + points = [] + for i in range(2, size * 2 + 2, 2): + points.append([0] * i) + middle = [] + for i in range(size * 2 - 1): + row = [0] * (size * 2) + middle.append(row) + epoints = list(row[:] for row in points[::-1]) + return points + middle + epoints + +def intify(points): + return map(lambda c: (int(c[0]), int(c[1])), points) + +def draw_triangle(im, points, cell, size): + draw = ImageDraw.Draw(im) + # draw.polygon(points, outline=(0, 0, 0)) + if cell: + draw.polygon(intify(points), fill=(0, 0, 0)) + return im + +def getsection(i, size): + return 0 if i <= size - 1 else (1 if i < 3 * size - 1 else 2) + +def getspace(size): + return max(0, sum(len(filter(lambda a: a == 0, b)) for b in empty_hex(size)) - 2) + +def generate_image(string, debug=False): + size = 0 + binstring = bin(int(string.encode("hex"), 16)).strip("0b") + while size < 2 or getspace(size + 1) < len(binstring): + size += 1 + n = getspace(size) + # print size, len(binstring) + if debug: print "SIZE", size, " n =", n + im = Image.new("RGB", (int(ISIZE), int(ISIZE)), "white") + pattern = empty_hex(size) + # print len(binstring) + # print sum(len(i) for i in pattern) + pattern[0][len(string) % 2] = 1 + curr = (1, 1 + len(string) % 2, 3 - len(string) % 2) + # 0 1 + # 3 2 + for c in range(n): # range(len(binstring)): + i, j, d = curr + row = pattern[i] + if c < len(binstring): + b = int(binstring[c]) + pattern[i][j] = b + if c % 2 == 0: + pattern[i][j] ^= 1 + + section = getsection(i, size) + leftfacing = [j % 2 == 0, j % 2 != (i - size) % 2, j % 2 == 0][section] + if debug: print "c =", c, ", i =", i, ", j =", j, ", d =", d, ", s =", section, ", l =", leftfacing + if section == 0: + if getsection(i + 1, size) == 0: + if leftfacing: + if d == 0: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j + 1, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + if j == len(row) - 1: + curr = i + 1, j + 2, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 2: + curr = i + 1, j + 1, d + elif d == 3: + curr = i, j - 1, d + elif getsection(i + 1, size) == 1: + if leftfacing: + if d == 0: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + if j == len(row) - 1: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i - 1, j - 1, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i, j - 1, d + elif section == 1: + if getsection(i - 1, size) == 0: + if leftfacing: + if j == len(row) - 1: + if d == 1: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 2, j, (d + 2) % 4 + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i - 1, j, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if j == 0: + if d == 0: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i + 2, j, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif getsection(i - 1, size) == 1: + if getsection(i + 1, size) == 1: + if leftfacing: + if j == len(row) - 1: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i + 2, j, (d + 2) % 4 + elif d == 2: + curr = i + 2, j, (d + 2) % 4 + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i - 1, j, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if j == 0: + if d == 0: + curr = i + 2, j, (d + 2) % 4 + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + curr = i + 2, j, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif getsection(i + 1, size) == 2: + if leftfacing: + if j == len(row) - 1: + if d == 0: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, (d + 2) % 4 + else: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i, j + 1, d + elif d == 2: + curr = i, j + 1, d + elif d == 3: + curr = i + 1, j, d + else: + if d == 0: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + curr = i + 1, j, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i, j - 1, d + elif section == 2: + if getsection(i - 1, size) == 1: + if leftfacing: + if d == 0: + curr = i - 1, j, d + elif d == 1: + curr = i, j + 1, d + elif d == 2: + curr = i, j + 1, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j, d + elif d == 2: + if j == len(row) - 1: + curr = i + 1, j - 2, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + elif getsection(i - 1, size) == 2: + if leftfacing: + if d == 0: + curr = i - 1, j + 1, d + elif d == 1 or d == 2: + curr = i, j + 1, d + elif d == 3: + if j == 0: + curr = i + 1, j, (d + 2) % 4 + else: + curr = i + 1, j - 1, d + else: + if j == len(row) - 1: + if d == 0: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j + 1, d + elif d == 2: + curr = i + 1, j - 2, (d + 2) % 4 + else: + if d == 0 or d == 3: + curr = i, j - 1, d + elif d == 1: + curr = i - 1, j + 1, d + elif d == 2: + curr = i + 1, j - 1, d + # for i in range(len(pattern)): + # for j in range(len(pattern[i])): + # section = 0 if i <= size - 1 else (1 if i < 3 * size - 1 else 2) + # leftfacing = [j % 2 == 0, j % 2 != (i - size) % 2, j % 2 == 0][section] + # if not leftfacing: + # print j, + # print + sidelen = (ISIZE - IMARGIN * 2) / (2.0 * size) + altitude = sidelen * ALTCONST + # print sidelen, altitude + for i in range(len(pattern)): + section = getsection(i, size) + row = pattern[i] + rowleft = (ISIZE / 2) - (altitude * len(row) / 2) + if section % 2 == 0: + evenrow = i % 2 == 0 + for j in range(len(row)): + cell = row[j] + top = ceil(i / 2.0) * sidelen - (0.5 * sidelen if not evenrow else 0) + IMARGIN + bottom = top + sidelen + if j % 2 == 0: + points = [ + (rowleft + altitude * j, top + sidelen / 2), + (rowleft + altitude * (j + 1), top), (rowleft + altitude * (j + 1), bottom) + ] + else: + points = [ + (rowleft + altitude * (j + 1), top + sidelen / 2), + (rowleft + altitude * j, top), (rowleft + altitude * j, bottom) + ] + draw_triangle(im, points, cell, size) + else: + evenrow = (i - size) % 2 == 1 + for j in range(len(row)): + cell = row[j] + top = ceil(i / 2.0) * sidelen - (0.5 * sidelen if i % 2 == 1 else 0) + IMARGIN + bottom = top + sidelen + if j % 2 == (i - size) % 2: + points = [ + (rowleft + altitude * (j + 1), top + sidelen / 2), + (rowleft + altitude * j, top), (rowleft + altitude * j, bottom) + ] + else: + points = [ + (rowleft + altitude * j, top + sidelen / 2), + (rowleft + altitude * (j + 1), top), (rowleft + altitude * (j + 1), bottom) + ] + draw_triangle(im, points, cell, size) + return im FLAG = "are_triangles_more_secure_than_squares?_%s}" def get_salt(random): - return "".join([random.choice("0123456789abcdef") for i in range(8)]) + salt = "".join([random.choice("0123456789abcdef") for i in range(8)]) + return salt + +def generate_flag(random): + salt = get_salt(random) + im = generate_image("easyctf{%s}" % (FLAG % salt)) + flag = StringIO() + im.save(flag, format="PNG") + return flag def generate(random): - salt = get_salt(random) - im = generate("easyctf{%s}" % (FLAG % salt)) - flag = StringIO() - im.save(buf, format="PNG") return dict(files={ - "flag.png": flag + "flag.png": generate_flag }) def grade(random, key): salt = get_salt(random) if key.find(FLAG % salt) >= 0: return True, "Correct!" - return False, "Nope." \ No newline at end of file + return False, "Nope." From 38f362252588cdc0c7ea1a2da0e58344a67173be Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Tue, 7 Mar 2017 16:04:58 -0600 Subject: [PATCH 04/14] Update --- count.py | 5 ++++- decode-me/problem.yml | 2 +- listen-closely/problem.yml | 2 +- luckyguess/problem.yml | 2 +- phunkypython1/problem.yml | 4 ++-- phunkypython2/problem.yml | 4 ++-- qrt/problem.yml | 4 ++-- wayward-space-junk/solution.txt | 4 ++++ 8 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 wayward-space-junk/solution.txt diff --git a/count.py b/count.py index bf76c05..a149b8f 100644 --- a/count.py +++ b/count.py @@ -24,10 +24,13 @@ problems.sort(key=lambda p: p.get("value"), reverse=True) print "Grand Total: %d" % len(problems) print "Category Breakdown:" +maxtitle = max(map(lambda p: len(p.get("title")), problems)) + 3 +maxauthor = max(map(lambda p: len(p.get("author")), problems)) + 3 + c = Counter(map(lambda p: p.get("category", ""), problems)) categories = sorted(c.items(), key=lambda c: c[1], reverse=True) for category, count in categories: print " %s: %s" % (category, count) for problem in problems: if problem.get("category") != category: continue - print " %s [%s]" % (problem.get("title"), problem.get("value")) + print " %s %s %sp" % (problem.get("title") + " " * (maxtitle - len(problem.get("title"))), problem.get("author") + " " * (maxauthor - len(problem.get("author"))), problem.get("value")) diff --git a/decode-me/problem.yml b/decode-me/problem.yml index d1ac42b..58059a7 100644 --- a/decode-me/problem.yml +++ b/decode-me/problem.yml @@ -1,7 +1,7 @@ title: Decode Me author: dududum561 hint: Simple decoding :) -category: Forensics +category: Cryptography autogen: false programming: false value: 100 diff --git a/listen-closely/problem.yml b/listen-closely/problem.yml index d25404f..cd18e72 100644 --- a/listen-closely/problem.yml +++ b/listen-closely/problem.yml @@ -1,7 +1,7 @@ author: GenericNickname title: Listen Closely hint: 1, 16, 8000 -category: Crytpography +category: Cryptography autogen: false programming: false value: 50 diff --git a/luckyguess/problem.yml b/luckyguess/problem.yml index 741186c..682babe 100644 --- a/luckyguess/problem.yml +++ b/luckyguess/problem.yml @@ -1,6 +1,6 @@ author: blockingthesky title: Lucky Guess -category: Reversing +category: Reverse Engineering autogen: false programming: false value: 200 diff --git a/phunkypython1/problem.yml b/phunkypython1/problem.yml index 449ec04..2f3722b 100644 --- a/phunkypython1/problem.yml +++ b/phunkypython1/problem.yml @@ -1,6 +1,6 @@ author: blockingthesky title: Phunky Python I -category: Reversing +category: Reverse Engineering autogen: true programming: false -value: 30 \ No newline at end of file +value: 30 diff --git a/phunkypython2/problem.yml b/phunkypython2/problem.yml index 1095691..7e88f3b 100644 --- a/phunkypython2/problem.yml +++ b/phunkypython2/problem.yml @@ -1,6 +1,6 @@ author: blockingthesky title: Phunky Python II -category: Reversing +category: Reverse Engineering autogen: true programming: false -value: 115 \ No newline at end of file +value: 115 diff --git a/qrt/problem.yml b/qrt/problem.yml index 35df231..1851c8f 100644 --- a/qrt/problem.yml +++ b/qrt/problem.yml @@ -1,5 +1,5 @@ title: Hex QR -category: Programming +category: Reverse Engineering value: 200 author: mzhang -autogen: true \ No newline at end of file +autogen: true diff --git a/wayward-space-junk/solution.txt b/wayward-space-junk/solution.txt new file mode 100644 index 0000000..bee1d74 --- /dev/null +++ b/wayward-space-junk/solution.txt @@ -0,0 +1,4 @@ +In reality, the space junk will be following a very predictable orbit, around +a polar function, which means that it will eventually be repeating as well. +The trick is to just shoot a bunch of test ones and see how far off you miss. +The pilot key simply identifies the team so they can enter the correct flag. From 98e4209e3968063024380b8934faf4239bd5cdbb Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Tue, 7 Mar 2017 18:33:17 -0600 Subject: [PATCH 05/14] Update qrt. --- qrt/grader.py | 2 +- qrt/qrt.py | 2 +- qrt/qrt.pyc | Bin 8304 -> 0 bytes 3 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 qrt/qrt.pyc diff --git a/qrt/grader.py b/qrt/grader.py index 0c8728b..0ff92c3 100644 --- a/qrt/grader.py +++ b/qrt/grader.py @@ -305,7 +305,7 @@ def generate_image(string, debug=False): draw_triangle(im, points, cell, size) return im -FLAG = "are_triangles_more_secure_than_squares?_%s}" +FLAG = "are_triangles_more_secure_than_squares?_%s" def get_salt(random): salt = "".join([random.choice("0123456789abcdef") for i in range(8)]) diff --git a/qrt/qrt.py b/qrt/qrt.py index d72640e..4175d36 100644 --- a/qrt/qrt.py +++ b/qrt/qrt.py @@ -36,7 +36,7 @@ def getspace(size): def generate(string, debug=False): size = 0 binstring = bin(int(string.encode("hex"), 16)).strip("0b") - while size < 2 or getspace(size + 1) < len(binstring): + while size < 3 or getspace(size + 1) - 8 < len(binstring): size += 1 n = getspace(size) # print size, len(binstring) diff --git a/qrt/qrt.pyc b/qrt/qrt.pyc deleted file mode 100644 index 02316a0bdc10cdf86b9e4a0650bc07903982a15d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8304 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 From f80895e5b42e0316038f8c11e7474bf7d5dc7e28 Mon Sep 17 00:00:00 2001 From: Brandon John Date: Wed, 8 Mar 2017 09:55:09 -0600 Subject: [PATCH 06/14] Updated QR2 value --- qr-2/problem.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qr-2/problem.yml b/qr-2/problem.yml index ec4b83f..8436350 100644 --- a/qr-2/problem.yml +++ b/qr-2/problem.yml @@ -3,7 +3,7 @@ author: wiresboy category: Forensics autogen: false programming: false -value: 180 +value: 330 hint: Is there another kind of Oboe? files: - qr.bmp \ No newline at end of file From 5320f9a77e6fcccc9337cedb3557950c077ff570 Mon Sep 17 00:00:00 2001 From: Brandon John Date: Wed, 8 Mar 2017 10:32:56 -0600 Subject: [PATCH 07/14] Added qr-1 --- qr-1/description.md | 2 ++ qr-1/grader.py | 4 ++++ qr-1/problem.yml | 9 +++++++++ qr-1/qr1.bmp | Bin 0 -> 480054 bytes 4 files changed, 15 insertions(+) create mode 100644 qr-1/description.md create mode 100644 qr-1/grader.py create mode 100644 qr-1/problem.yml create mode 100644 qr-1/qr1.bmp diff --git a/qr-1/description.md b/qr-1/description.md new file mode 100644 index 0000000..6db579b --- /dev/null +++ b/qr-1/description.md @@ -0,0 +1,2 @@ +I just saw this QR code the other day, but couldn't tell what data it has. Can you help? +[Here](${qr1_bmp}) it is. \ No newline at end of file diff --git a/qr-1/grader.py b/qr-1/grader.py new file mode 100644 index 0000000..1348b0f --- /dev/null +++ b/qr-1/grader.py @@ -0,0 +1,4 @@ +def grade(autogen, answer): + if answer.find("n0w_who-w0u1d_do_thAT_to_Th3ir_QR?") != -1: + return True, "Congrats!" + return False, "Nope, try again." \ No newline at end of file diff --git a/qr-1/problem.yml b/qr-1/problem.yml new file mode 100644 index 0000000..f0a64e7 --- /dev/null +++ b/qr-1/problem.yml @@ -0,0 +1,9 @@ +title: QR 1 +author: wiresboy +category: Forensics +autogen: false +programming: false +value: 100 +hint: Is the image only black and white? +files: + - qr1.bmp \ No newline at end of file diff --git a/qr-1/qr1.bmp b/qr-1/qr1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f43285c174bdb076896238beef0a5bd3deb69a9e GIT binary patch literal 480054 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
ME?vs=0vO}fP{wuNwu>|CbvUX`mmgg&^?{3p4G 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 krh#c-8kh#AfoWhGmcYPZq&g410nrVL;wH) literal 0 HcmV?d00001 From bf5542e43819ea63f58cecbdff5b1975fbee24af Mon Sep 17 00:00:00 2001 From: Brandon John Date: Wed, 8 Mar 2017 10:33:10 -0600 Subject: [PATCH 08/14] Renamed qr.bmp to qr2.bmp --- qr-2/description.md | 2 +- qr-2/problem.yml | 2 +- qr-2/{qr.bmp => qr2.bmp} | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename qr-2/{qr.bmp => qr2.bmp} (100%) diff --git a/qr-2/description.md b/qr-2/description.md index 254c112..65e6596 100644 --- a/qr-2/description.md +++ b/qr-2/description.md @@ -1 +1 @@ -When I am not practicing my [Oboe](https://en.wikipedia.org/wiki/Oboe) for band, I have been working on a QR code generator. For some reason, some of the images are not scannable. [Here](${qr_bmp}) is one, can you tell me what it says? \ No newline at end of file +When I am not practicing my [Oboe](https://en.wikipedia.org/wiki/Oboe) for band, I have been working on a QR code generator. For some reason, some of the images are not scannable. [Here](${qr2_bmp}) is one, can you tell me what it says? \ No newline at end of file diff --git a/qr-2/problem.yml b/qr-2/problem.yml index 8436350..597ffd3 100644 --- a/qr-2/problem.yml +++ b/qr-2/problem.yml @@ -6,4 +6,4 @@ programming: false value: 330 hint: Is there another kind of Oboe? files: - - qr.bmp \ No newline at end of file + - qr2.bmp \ No newline at end of file diff --git a/qr-2/qr.bmp b/qr-2/qr2.bmp similarity index 100% rename from qr-2/qr.bmp rename to qr-2/qr2.bmp From 5d2e620fc1173fbbac0aa98a4d35602b4389dbe0 Mon Sep 17 00:00:00 2001 From: Brandon John Date: Wed, 8 Mar 2017 15:24:44 -0600 Subject: [PATCH 09/14] Added fizz-buzz-2's source grader --- fizz-buzz-2/source_grader.py | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 fizz-buzz-2/source_grader.py diff --git a/fizz-buzz-2/source_grader.py b/fizz-buzz-2/source_grader.py new file mode 100644 index 0000000..ebd2523 --- /dev/null +++ b/fizz-buzz-2/source_grader.py @@ -0,0 +1,5 @@ +code = raw_input() +if ("i" in code) or ("I" in code) or ("?" in code): + print "Your program contains an 'i', 'I', or '?'. Please remove it and try again." +else + print "OK" \ No newline at end of file From b755f8e6f723ea82fe0c10b0ae45eb5839315bc8 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 9 Mar 2017 02:52:33 -0600 Subject: [PATCH 10/14] count.py now works in py3 and py2 Figured compatibility is good --- count.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/count.py b/count.py index a149b8f..60f1ed1 100644 --- a/count.py +++ b/count.py @@ -21,8 +21,8 @@ for problem_name in problem_names: # print traceback.format_exc() problems.sort(key=lambda p: p.get("value"), reverse=True) -print "Grand Total: %d" % len(problems) -print "Category Breakdown:" +print("Grand Total: %d" % len(problems)) +print("Category Breakdown:") maxtitle = max(map(lambda p: len(p.get("title")), problems)) + 3 maxauthor = max(map(lambda p: len(p.get("author")), problems)) + 3 @@ -30,7 +30,7 @@ maxauthor = max(map(lambda p: len(p.get("author")), problems)) + 3 c = Counter(map(lambda p: p.get("category", ""), problems)) categories = sorted(c.items(), key=lambda c: c[1], reverse=True) for category, count in categories: - print " %s: %s" % (category, count) + print(" %s: %s" % (category, count)) for problem in problems: if problem.get("category") != category: continue - print " %s %s %sp" % (problem.get("title") + " " * (maxtitle - len(problem.get("title"))), problem.get("author") + " " * (maxauthor - len(problem.get("author"))), problem.get("value")) + print(" %s %s %sp" % (problem.get("title") + " " * (maxtitle - len(problem.get("title"))), problem.get("author") + " " * (maxauthor - len(problem.get("author"))), problem.get("value"))) From 7c970f316f0dbcf85a5ea03ba86c5046b78d3c7f Mon Sep 17 00:00:00 2001 From: John Date: Thu, 9 Mar 2017 02:56:41 -0600 Subject: [PATCH 11/14] Added a simple rop problem Needs to be built on a linux machine and the binary put in the files/description so that its easier to solve. Also needs to be put on the shell. --- simple-rop/Makefile | 2 ++ simple-rop/description.md | 3 +++ simple-rop/flag.txt | 1 + simple-rop/grader.py | 4 ++++ simple-rop/problem.yml | 7 +++++++ simple-rop/simple-rop.c | 25 +++++++++++++++++++++++++ 6 files changed, 42 insertions(+) create mode 100644 simple-rop/Makefile create mode 100644 simple-rop/description.md create mode 100644 simple-rop/flag.txt create mode 100644 simple-rop/grader.py create mode 100644 simple-rop/problem.yml create mode 100644 simple-rop/simple-rop.c diff --git a/simple-rop/Makefile b/simple-rop/Makefile new file mode 100644 index 0000000..96f2342 --- /dev/null +++ b/simple-rop/Makefile @@ -0,0 +1,2 @@ +(all): + gcc -m32 -o simple-rop -fno-stack-protector -O0 simple-rop.c \ No newline at end of file diff --git a/simple-rop/description.md b/simple-rop/description.md new file mode 100644 index 0000000..feda140 --- /dev/null +++ b/simple-rop/description.md @@ -0,0 +1,3 @@ +On the shell there is a folder ``. +Read flag.txt +[Source](${simple-rop.c}) \ No newline at end of file diff --git a/simple-rop/flag.txt b/simple-rop/flag.txt new file mode 100644 index 0000000..43e31ae --- /dev/null +++ b/simple-rop/flag.txt @@ -0,0 +1 @@ +easyctf{r0p_7o_v1ct0ry} \ No newline at end of file diff --git a/simple-rop/grader.py b/simple-rop/grader.py new file mode 100644 index 0000000..31e162c --- /dev/null +++ b/simple-rop/grader.py @@ -0,0 +1,4 @@ +def grade(random, key): + if key.find("r0p_7o_v1ct0ry") != -1: + return True, "Correct!" + return False, "Nope." diff --git a/simple-rop/problem.yml b/simple-rop/problem.yml new file mode 100644 index 0000000..14f06a3 --- /dev/null +++ b/simple-rop/problem.yml @@ -0,0 +1,7 @@ +title: Simple Rop +category: Binary Exploitation +value: 75 +author: r3ndom +autogen: false +files: + - simple-rop.c diff --git a/simple-rop/simple-rop.c b/simple-rop/simple-rop.c new file mode 100644 index 0000000..f3c33e3 --- /dev/null +++ b/simple-rop/simple-rop.c @@ -0,0 +1,25 @@ +#include +#include + +void print_flag(); +void what_did_you_say(); + +int main(int argc, char* argv[]) +{ + gid_t gid = getegid(); + setresgid(gid, gid, gid); + what_did_you_say(); + return 0; +} + +void print_flag() +{ + system("cat flag.txt"); +} + +void what_did_you_say() +{ + char buff[64]; + gets(buff); + printf("You said: %s\n", buff); +} From 08cb80c384387a95ca9b5638ecb4d2e9c716fea6 Mon Sep 17 00:00:00 2001 From: meeees Date: Thu, 9 Mar 2017 23:24:48 -0600 Subject: [PATCH 12/14] changed category of Bizarro to forensics --- bizarro/problem.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bizarro/problem.yml b/bizarro/problem.yml index eab180d..e41572d 100644 --- a/bizarro/problem.yml +++ b/bizarro/problem.yml @@ -1,6 +1,6 @@ author: blockingthesky title: Bizarro -category: Steganography +category: Forensics autogen: false programming: false value: 400 From 44146b8027370d3dbad0154e4e0b342931c3c4b2 Mon Sep 17 00:00:00 2001 From: meeees Date: Fri, 10 Mar 2017 00:17:08 -0600 Subject: [PATCH 13/14] tried to make the point values for my problems more reasonable, probably could still be tuned but w/e --- flag-peg/problem.yml | 2 +- listen-closely/problem.yml | 2 +- match-me/problem.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flag-peg/problem.yml b/flag-peg/problem.yml index 13c6e47..1080de2 100644 --- a/flag-peg/problem.yml +++ b/flag-peg/problem.yml @@ -4,6 +4,6 @@ hint: You're not looking deep enough category: Forensics autogen: false programming: false -value: 50 +value: 150 files: - heresaflag.jpg diff --git a/listen-closely/problem.yml b/listen-closely/problem.yml index cd18e72..051ef0d 100644 --- a/listen-closely/problem.yml +++ b/listen-closely/problem.yml @@ -4,6 +4,6 @@ hint: 1, 16, 8000 category: Cryptography autogen: false programming: false -value: 50 +value: 300 files: - listenclosely.wav diff --git a/match-me/problem.yml b/match-me/problem.yml index f5608f7..bf9854d 100644 --- a/match-me/problem.yml +++ b/match-me/problem.yml @@ -4,7 +4,7 @@ hint: This is a fairly well-known graph problem, there's probably some sort of i category: Algorithms autogen: false programming: false -value: 50 +value: 400 files: - female_prefs.txt - male_prefs.txt From 93577ddee37a489cf0aa1a4b987d23a3bc3d2657 Mon Sep 17 00:00:00 2001 From: Jacob Magnuson Date: Fri, 10 Mar 2017 23:21:07 +0000 Subject: [PATCH 14/14] removed dijkstra --- dijkstra/description.md | 22 -------- dijkstra/dijkstra_map.svg | 108 -------------------------------------- dijkstra/grader.py | 4 -- dijkstra/problem.yml | 9 ---- rsa1/description.md | 1 + rsa1/grader.py | 4 ++ rsa1/problem.yml | 9 ++++ rsa1/rsa3 | 2 + 8 files changed, 16 insertions(+), 143 deletions(-) delete mode 100644 dijkstra/description.md delete mode 100644 dijkstra/dijkstra_map.svg delete mode 100644 dijkstra/grader.py delete mode 100644 dijkstra/problem.yml create mode 100644 rsa1/description.md create mode 100644 rsa1/grader.py create mode 100644 rsa1/problem.yml create mode 100644 rsa1/rsa3 diff --git a/dijkstra/description.md b/dijkstra/description.md deleted file mode 100644 index 80240a6..0000000 --- a/dijkstra/description.md +++ /dev/null @@ -1,22 +0,0 @@ -This is a high-level programming challenge. Given a set of vertices corresponding to the map below, your program must output the shortest path from `a` to `z`. - -![image](${dijkstra_map_svg}) - -The length of the line segments is randomized such that the length (`l`) satisfies `20 <= l <= 120`. - -Input will consist of 49 lines in the format `vertex1 vertex2 distanceBetween` - -Here are a few lines of example input: -```shell -h i 94 -h o 40 -i l 95 -l k 65 -l t 63 -t u 47 -``` - -The output should be written to a file named "dijkstra.out" in the current directory. Output will consist of the entire path, with `->` in between vertices. Print the current distance traveled in parenthesis after each vertex, as shown below. -``` -a -> b(113) -> c(210) -> f(262) -> h(291) -> i(326) -> m(381) -> s(409) -> x(444) -> y(534) -> z(557) -``` \ No newline at end of file diff --git a/dijkstra/dijkstra_map.svg b/dijkstra/dijkstra_map.svg deleted file mode 100644 index 5cc8600..0000000 --- a/dijkstra/dijkstra_map.svg +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - -A -B -E -C -D -F -J -K -L - - - - -M -I -H -G - - - - - - - - - - - - -P -Q -R -X -Y -Z -V -U - -T -S -N -O -W - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start: ATarget: Z - diff --git a/dijkstra/grader.py b/dijkstra/grader.py deleted file mode 100644 index edf74d0..0000000 --- a/dijkstra/grader.py +++ /dev/null @@ -1,4 +0,0 @@ -def grade(autogen, answer): - if answer.find("edsger_wybe_dijkstra_was_a_happy_accident") != -1: - return True, "Great Job! That's a tough one." - return False, "Nope, try again." \ No newline at end of file diff --git a/dijkstra/problem.yml b/dijkstra/problem.yml deleted file mode 100644 index b6292db..0000000 --- a/dijkstra/problem.yml +++ /dev/null @@ -1,9 +0,0 @@ -title: Dijkstra -author: ztaylor54 -hint: You might consider reading up on shortest-path algorithms. -category: Programming -autogen: false -programming: false -value: 450 -files: - - dijkstra_map.svg \ No newline at end of file diff --git a/rsa1/description.md b/rsa1/description.md new file mode 100644 index 0000000..6f6a960 --- /dev/null +++ b/rsa1/description.md @@ -0,0 +1 @@ +We came across another [message]($rsa3) that follows the same cryptographic schema as those other Really Scary Admin messages. Take a look and see if you can crack it. \ No newline at end of file diff --git a/rsa1/grader.py b/rsa1/grader.py new file mode 100644 index 0000000..e9ca30f --- /dev/null +++ b/rsa1/grader.py @@ -0,0 +1,4 @@ +def grade(autogen, key): + if key.find("tw0_v3ry_merrry_tw1n_pr1m35!!_417c0d") != -1: + return True, "Really Superb! Applause!" + return False, "RIP" diff --git a/rsa1/problem.yml b/rsa1/problem.yml new file mode 100644 index 0000000..c38e4f0 --- /dev/null +++ b/rsa1/problem.yml @@ -0,0 +1,9 @@ +author: blockingthesky +title: RSA 3 +hint: You might want to read up on how RSA works. +category: Cryptography +autogen: false +programming: false +value: 70 +files: + - rsa3 diff --git a/rsa1/rsa3 b/rsa1/rsa3 new file mode 100644 index 0000000..bda7c13 --- /dev/null +++ b/rsa1/rsa3 @@ -0,0 +1,2 @@ +{N : e : c} +{0x27335d21ca51432fa000ddf9e81f630314a0ef2e35d81a839584c5a7356b94934630ebfc2ef9c55b111e8c373f2db66ca3be0c0818b1d4eda7d53c1bd0067f66a12897099b5e322d85a8da45b72b828813af23L : 0x10001 : 0x9b9c138e0d473b6e6cf44acfa3becb358b91d0ba9bfb37bf11effcebf9e0fe4a86439e8217819c273ea5c1c5acfd70147533aa550aa70f2e07cc98be1a1b0ea36c0738d1c994c50b1bd633e3873fc0cb377e7L} \ No newline at end of file