crypto200-1 Write up
まともに解いたのこれくらいだった。。
cryptの基礎が詰まってて結構面白かったのでWrite upしておきます。
crypto 200-1
H4x0R got this weird code while coming back from school. can you get a 32char code flag that can make him happy ?
[bash]
//一行
1f8b08089c452c530003737465703900edd85b6ec3300c44d1ffae86dc
ffe61ac7e1437403e42b1a171745d02a946c890713383537f3c7cb3c7e
8e37ec7c99d7fb39cbe3afaa5bac89f1735e5c3597bf263e571ef52ab5
49d6d759bb5eed2de6d7c56bf76d3f6de47d76ac8e9567c9bdefb0d7db
e16c3d67ded997bbb71eae3d8d7db8d796d6fed7fda317f808fb5ceaf8
48f9b48ee1a3e833ebf868f9901f6d9f59c747cb87fca8faacfbc1079f
bbf8ccfa469f1ce323999f4b1d9f6b7d8f4f1e161ff2732b1ff2a3eda3
911f7cb47d78bed6f6213fef7c667da3cfa58e0ff9c1071f7cf0f986cf
ace3830f3e1f7fffb9d4f1c147dd67d6f7f8f43ee0d37d34f29387c547
d6a7c6f828faf48ee1e335191f611ff283cf673e35c647d1a7770c1f2d
9fb33ff8a8fa909f3bf8cc3a3e5a3ee447d9a7c6f8a8f9f8da157c14ff
7f80cf1f3e1af9895ee0a3e973cec147d5270f8b8fa40fcf07da3ed10b
7ca6cfacefcc8f8d3a3e2af9e1f3ed9d8f467ef2b0f8e8e6071f599fe8
053e9a3ee4e7063e39c647d287fce0830f3effd327f6808fa6cfd2317c
b47c7a1ff0d1f3213fda3ee447db87fc68fbb4fbe123e8e36b57f0499f
59df989fd6317ce4f2137bc067f1d1c8cfd99f65ddebe0a976fcfef905
9996b432616b0000
[/bash]
16進数っぽいので、とりあえずASCIIコードに変換・・・
してみるも、全く読めず。元データの長さが944だったので、16で割り切れるな?と思い、16文字のハッシュ探しても見つからなかった。8文字はあったけど、うーん。
ひと通り試してだめだったので、ASCIIコードに変換した時に見つけたstep9という文字から、もしかしたら何かのファイルなのかなということで、バイナリエディタで直接貼り付けて、ファイル化してfileコマンドを実行してみた。
[bash]
$ file raw.bin
raw.bin: gzip compressed data, was "step9", from Unix, last modified: Fri Mar 21 22:58:52 2014
[/bash]
[bash]
// raw2(一行)
010011000101010101100100010000100・・・(中略)・・・1000011011001110011110100111101
[/bash]
2進数でてきた。
読みづらいので16進数に変換してみる。
>>> raw2 = open("raw2.txt", "r")
>>> raw2tohex = open("raw2tohex.txt", "w")
>>> i = raw2.readline()
>>> raw2.close()
>>> h = hex(int(i, 2))
>>> raw2tohex.write(str(h))
>>> raw2tohex.close()
[/python]
開くと
[bash]
0x4C55644255316C42524651714A・・・(中略)・・・56436F6D4C544D7843673D3DL
[/bash]
0xとLを取ってASCIIコードに変換すると
[bash]
LUdBU1lBRFQqJi0yNS1H・・・(中略)・・・MzYtR0FTWUFEVComLTMxCg==
[/bash]
お、base64。デコードしてみる。
[bash]
-GASYADT*&-25-GASYADT*&-33-GASYADT*&-37-GASYADT*&-25-・・・(中略)・・・GASYADT*&-25-GASYADT*&-36-GASYADT*&-
[/bash]
GASYADTってなんぞ?とりあえずGASYADTを取り除いて数値だけ取り出す。
[bash]
//一行
253337253335253336253337253336253337253336253333253
333253631253332253636253332253636253336253333253336
253635253336253336253336253337253337253332253332253
635253336253338253336253636253336253338253336253331
253336253337253336253338253332253635253337253330253
336253332253337253631253332253636253333253337253333
253331253333253333253333253330253333253335253333253
335253333253334253332253636253330253631
[/bash]
だいぶ短くなってきた。
25が多いな?確か25は%だったから、URLエンコードかな?
というわけで、二文字おきに%でつないでURLデコード。
[python]
#coding: utf-8
def splitStr2(str, num):
l = []
for i in range(num):
l.append(str[i::num])
l = ["".join(i) for i in zip(*l)]
rem = len(str) % num # zip で捨てられた余り
if rem:
l.append(str[-rem:])
return l
s = "2533372533352533362533372533362533372533362533332533332
536312533322536362533322536362533362533332533362536352533362
533362533362533372533372533322533322536352533362533382533362
536362533362533382533362533312533362533372533362533382533322
536352533372533302533362533322533372536312533322536362533332
533372533332533312533332533332533332533302533332533352533332
53335253333253334253332253636253330253631"
s2 = splitStr2(s, 2)
ans = ""
for v in s2:
ans += "%" + v
print(ans)
[/python]
出てきたものをURLデコード。
[bash]
%37%35%36%37%36%37%36%33%33%61%32%66%32%66%36%33%36%65%36%36%36%37%37%32%32%65%36%38%36%66%36%38%36%31%36%37%36%38%32%65%37%30%36%32%37%61%32%66%33%37%33%31%33%33%33%30%33%35%33%35%33%34%32%66%30%61
[/bash]
もういっちょ!
[bash]
756767633a2f2f636e6667722e686f686167682e70627a2f373133303535342f0a
[/bash]
ASCIIコードに直してみる。
[bash]
uggc://cnfgr.hohagh.pbz/7130554/
[/bash]
むむむっ これは換字式暗号。rot13をとりあえず試してみる。
[bash]
http://paste.ubuntu.com/7130554/
[/bash]
URLゲット!
アクセスすると
[bash]
5d3144233c46404dba4afc766601b997
[/bash]
32文字のMD5をゲットしました。これがフラグでした。
長かったけど楽しかった。
backdoorCTFは割と簡単な問題が多かったっぽい感じがするので、復習しておかないとな。。