Hack.lu 2013 CTF [Packed]
全く解けなかったけど忘れないうちにメモ
データの中身は
"(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なるものを知る。(先にツール探せばよかった・・・)