Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier Writeup: Programming 200

Weekend ini saya ikut bermain CTF Trend Micro Qualifier 2015 bersama teman-teman kantor, sangat menarik dan menantang (banyak yang susah menurut saya :D), terutama bagi newbie dalam CTF seperti saya. Writeup dari dua soal yang saya selesaikan akan di tulis dalam dua postingan terpisah, berikut yang pertama (yang kedua ada di link ini https://jampasir.wordpress.com/2015/09/27/trend-micro-ctf-asia-pacific-japan-2015-online-qualifier-writeup-analysis-offensive-200/), soal Programming dengan skor 200

soal

# Calculate it.
# nc ctfquest.trendmicro.co.jp 51740

saat nc ke server tersebut kita akan mendapat soal matematika dengan berbagai variasinya dan harus menjawabnya dengan dengan cepat sebelum timeout, ada yang dalam bentuk sederhana (misal 5 + 5) atau dalam format romawi (misal V + IX) atau dalam format kata (misal one + zero – seven) atau kombinasi ketiganya (misal 5 + one – IX). challenge ini saya selesaikan dengan membuat python, berikut log-nya:

awalnya
awalnya

selanjutnya: Screen Shot 2015-09-27 at 12.55.46 PM

akhirnya:

Screen Shot 2015-09-27 at 12.56.15 PM

dapat flagnya: TMCTF{U D1D 17!}
berikut kode python yang saya buat untuk menyelesaikan challenge tersebut (berantakan tambal sulam, ga diperbaiki apa adanya ini mah :D ):

# Category: Programming
# Points: 200

# Calculate it.
# nc ctfquest.trendmicro.co.jp 51740

import socket
import re
import string
from wordstonumbers import WordsToNumbers

def netcat(hostname, port, content):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    # s.sendall(content)
    # s.shutdown(socket.SHUT_WR)
    # s.settimeout(0.6)
    hasil = []
    i = 0
    while 1:
        data = s.recv(1028)

        if data == "":
            break
        print "Received:", repr(data)
        index_soal = data.rfind("=")
        soal = data[:index_soal]
        soal = string.replace(soal, ',','')
        # if i > 30: # expect roman, an alphanumeric 
        regex = re.compile(r'\b(?=[MDCLXVI]+\b)M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})\b')
        soal = regex.sub(roman_to_int_repl, soal)
        # words to number
        # if soal[0] in string.ascii_letters:
        soal = numericify(soal)

        s.sendall(str(eval(str(soal))))
        # i += 1

    print "Connection closed."
    s.close()

numeral_map = zip(
    (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
    ('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
)

def roman_to_int(n):
    n = unicode(n).upper()

    i = result = 0
    for integer, numeral in numeral_map:
        while n[i:i + len(numeral)] == numeral:
            result += integer
            i += len(numeral)
    return result

def roman_to_int_repl(match):
    return str(roman_to_int(match.group(0)))

def words_to_number(match):
    wtn = WordsToNumbers()
    return str(wtn.parse(match.group(0)))

def words_to_number2(string):
    wtn = WordsToNumbers()
    return str(wtn.parse(string))

numbers = string.ascii_letters +' ' + string.digits

def split_operators(s):
    l = []
    last_number = ""
    for c in s:
        if c in numbers:
            last_number += c
        else:
            if last_number:
                l.append(last_number.lstrip().rstrip())
                last_number = ""
            if c:
                l.append(c)
    if last_number:
        l.append(last_number)
    return l

def numericify(s):
    vals = split_operators(s)
    # print val
    result = ""
    operators = "+-/*//()"
    for x in xrange(0,len(vals)):
        val = vals[x].lstrip().rstrip()
        # print val
        if val in operators:
            result += val
        else: # ada dua kemungkinan, yaitu word atau digit
            if is_number(val):
                result += val
            else:
                result += words_to_number2(val)

    return result

def is_number(var):
    try:
       int(var)
       return True
    except Exception:
       return False

netcat("ctfquest.trendmicro.co.jp", 51740, "")

2 thoughts on “Trend Micro CTF Asia Pacific & Japan 2015 Online Qualifier Writeup: Programming 200

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s