2014年3月3日月曜日

SECCON2013 online writeup - calculate it / 計算せよ プログラミング・crypt 100

SECCON2013 online の writeup です。 プログラミング・cryptの100点問題、calculate it/計算せよ、です。
指定されたサーバにアクセスすると問題が表示されそれを答えていくというもの。
以下のようにサーバへアクセスするとランダムに問題文が表示されます。


nc calculateit.quals.seccon.jp 45105
1/224345516-1721549/6 = 
86
No good.

適当に答えを入れても正解しません。しばらくすると以下のようなヒントが出されてボーリングのスコアだと分かります。


Hint1: 四則演算ではありません / It is not a four arithmetic operations.
Hint2: 計算例 81 9- 16 6- 4/ 15 X  3- 72 45  = 82
Hint3: G- G- G- G- G- G- G- G- G- G-  = 0
Hint4: X  X  X  X  X  X  X  X  X  XXX = 300


いくつか手動で解こうとしますが制限時間があり自動で計算するプログラムにする必要があります。かつ、下記のように何回も問題が出てきます。


root@bt:~/Desktop/download/crypt100# python calc5.py 
['6', '1', '6', '/', '2', '4', '3', '1', '5', '3', '1', '-', '4', '/', '4', '5', 'X', '2', '3']
81

616/2431531-4/45X23
['7', '2', '4', '3', '6', '-', '8', '1', '7', '-', '8', '/', '4', '/', '5', '-', '6', '2', '1', '6']
87

72436-817-8/4/5-6216
['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', '4', '/', 'G']
264

XXXXXXXXX4/G
['G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', 'G', '-', '1', '2']
3

G-G-G-G-G-G-G-G-G-12
['G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', 'G', '/', '5']
105

かつ、100問近く解いて最後に「最高点は?」というような質問があり最終的には下記のような回答が得られます。
(適当に書いたスクリプトなので答えの出力が微妙ですが。。。)


['G', 'o', 'o', 'd', '!', '!', '\n', 'F', 'L', 'A', 'G', ':', ' ', 'B', 'o', 'w', 'l', 'i', 'n', 'g', ' ', 'i', 's', ' ', 'v', 'e', 'r', 'y', ' ', 'f', 'u', 'n', '!', '!', '\n']

Flagは Bowling is very fun!! でした。
適当にかつ必要な部分だけのスクリプトですが下記にさらしておきます。


import socket

def solve(data):
    bangou1 = 0
    bangou2 = 0
    score = 0
    char_list=list(data)
    print char_list
    i = len(char_list)
    n=1
    m=i
    for y in char_list:
        if(y =='-' or y == 'G'):
            char_list[bangou1]='0'
        bangou1=bangou1+1
    X_list=char_list
    X_count=0
    for x in X_list:
        if(x == 'X'):
           X_count=X_count+1
        X_count=X_count+1
    if(char_list[i-2] == '/'):
        if(char_list[i-1] == 'X'):
            char_list[i-1] == '10'
        m = i-1
    if(char_list[i-3] == 'X'):
        if(char_list[i-2] == 'X'):
            char_list[i-2] == '10'
        if(char_list[i-1] == 'X'):
            char_list[i-1] == '10'
        if(char_list[i-1] == '/'):
            char_list[i-2] == '10'
            char_list[i-1] == '0'
        if(X_count>20):
            m = i-2
    for x in char_list:
        if(x == '/'):
            if(char_list[bangou2+1] == 'X'):
                score = score + 10 - int(char_list[bangou2-1]) + 10
            else:
                score = score + 10 - int(char_list[bangou2-1]) + int(char_list[bangou2+1])
        elif(x =='X'):
            if(char_list[bangou2+1] == 'X' and char_list[bangou2+2] != 'X'):
                score = score + 10 + int(char_list[bangou2+2]) + 10
            elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] != 'X'):
                score = score + 10 + 10 + int(char_list[bangou2+2])
            elif(char_list[bangou2+2] == 'X' and char_list[bangou2+1] == 'X'):
                score = score + 10 + 10 + 10
            elif(char_list[bangou2+2] == '/'):
                score = score + 10 + 10
            else:
                score = score + 10 + int(char_list[bangou2+2]) + int(char_list[bangou2+1])
        else:
            score = score + int(x)
        bangou2 = bangou2 + 1
        if (n==m):
            break
        n=n+1
    score = str(score) + "\r\n"
    return score

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('calculateit.quals.seccon.jp', 45105))
total_score =0
hi_score=0
low_score=500
p_count=0

while True:
    p_count = p_count+1
    q = s.recv(1024)
    q = q.replace(' =', '').rstrip()
    if 'total' in q:
        total_score = str(total_score) + "\r\n"
        s.send(total_score)
        q = s.recv(1024)
    if 'hi' in q:
        hi_score = str(hi_score) + "\r\n"
        s.send(hi_score)
        q = s.recv(1024)
    a = solve(q)
    total_score=total_score+int(a)
    if(int(a)>hi_score):
        hi_score=int(a)
    if(int(a)










0 件のコメント:

コメントを投稿