Hack.lu 2013 CTF [Packed]

全く解けなかったけど忘れないうちにメモ

データの中身は

  • PDF

"(no hint given)"とだけ書いてある

  • やたら長いBASE64文字列

デコードしたらOpenTypeDocumentだった
こっちも中身は"still no hint given"

  • 謎のコード

ファイルの頭に書いてある#disable-encodingの辺りにrot13的なことが書いてあったのでdecode("rot13")

cipher="H51\\\'Ux2J& (3Z;Uxcx0Xxs\x13h\x014$V!R($R>\t/)R!\x01<.\x13,N-aP4M4aRuG1-VuU0 GuH a@0W=3R9\x01>(_0\x01,8C0Rx GuN6\"V|\x1ezKZ3\x014$]}R!2\x1d4S?7\x1au\x1fxs\t_\x01xa\x13<Gx)R&Ip2J&\x0f93T#zj\x1c\x1ap\x13rk\x00g\x01e|\x13g\x19ju\x0ba\x18jt\x02o xa\x13u\x01xa\x13%S1/Gu\x03\x1b.\\:N7.\\:N4o\x13\x0cN-3\x133M9&\x13<Rx A2WjiZ{DvaX0Xjh\x136N6\"R!\x01\x07rC0p\x138a\x1dc22ieu\x161Fw =-@0\x1bRa\x13u\x01(3Z;UxcR\'F.s\x1c>D!s\x13<Rx,Z&R1/Tw R"
n =0 ;import hashlib ,sys ;
try :key =sys.argv[1]
except IndexError :sys.exit("x\x9c\xf3N\xadT0T\xc8\xcd,.\xce\xccKW\xc8\xccSH,J/\x03\x00M\x97\x07\\".decode("mvc")) 
f =getattr(hashlib ,"x\x9c\xcbM1\x05\x00\x02G\x01\x07".decode("mvc"))
while n <(5 *10 **6 ):key =(f(key ).digest());n =n +1
key =key [:5 ].upper ()
while len (key )<len(cipher ):key =key *2
plain ="".join (map(chr ,[ord(a )^ord(b ) for a ,b in zip(cipher ,key )]))
try :exec plain
except :print "x\x9c\x0b/\xca\xcfKW\xf0N\xadT\x04\x00\x14d\x03x".decode("mvc"), repr(plain)

cipherの中身はともかく、decode("mvc")の意味がわからず暫く悩む
→チームメイトから「この部分デコードしなくていいんでね」的なことを言われた
つまりdecode("zip") ・・・( ´゚д゚`)
よって

cipher="H51\\\'Ux2J& (3Z;Uxcx0Xxs\x13h\x014$V!R($R>\t/)R!\x01<.\x13,N-aP4M4aRuG1-VuU0 GuH a@0W=3R9\x01>(_0\x01,8C0Rx GuN6\"V|\x1ezKZ3\x014$]}R!2\x1d4S?7\x1au\x1fxs\t_\x01xa\x13<Gx)R&Ip2J&\x0f93T#zj\x1c\x1ap\x13rk\x00g\x01e|\x13g\x19ju\x0ba\x18jt\x02o xa\x13u\x01xa\x13%S1/Gu\x03\x1b.\\:N7.\\:N4o\x13\x0cN-3\x133M9&\x13<Rx A2WjiZ{DvaX0Xjh\x136N6\"R!\x01\x07rC0p\x138a\x1dc22ieu\x161Fw =-@0\x1bRa\x13u\x01(3Z;UxcR\'F.s\x1c>D!s\x13<Rx,Z&R1/Tw R"
n =0 ;import hashlib ,sys ;
try:
key=sys.argv[1]
except IndexError :
sys.exit('Key 1 missing in argv')
f=getattr(hashlib,"md5")
while n <(5 *10 **6 ):
key=(f(key).digest());n =n+1 
key =key [:5].upper()
while len (key )<len (cipher ):key =key *2 
plain ="".join(map(chr,[ord (a)^ord(b)for a,b in zip(cipher, key)]))
try :
exec plain 
except :
print 'Wrong Key!', repr(plain)

こうなった。
あとで見てみたら問題の追記に"Excuse the inaccuracy." ('A`)

で、xorのkeyを探せば良いらしい。
とりあえず復号後がprintableになるようなkeyを力技で探したけれど、候補が多すぎて間に合わず。

終わった後にWriteupを探してxortoolsなるものを知る。(先にツール探せばよかった・・・)