Bring the noise - Crypto - 200 pts - realized by veorqncコマンドで指示されたサーバー、ポートに接続すると、Challenge = ?????と表示されて入力待ちになります。
Quantum computers won't help you
Source
Running on: bringthenoise.insomnihack.ch:1111
>nc.exe bringthenoise.insomnihack.ch 1111何か適当に入力するとすると、「Wrong」と表示されて切断されてしまいます。
Challenge = 19fee
aaaaさて、ここで提示されているソースを確認します。
Wrong
35~41行目が1つ目の入力チェック部分です。Challenge = ?????の部分は、ランダムな16進文字列5桁が表示される(ソース35~36行目)ようです。そして、入力した文字列をMD5でハッシュ化した16進文字列(ソース38行目)の先頭5桁が一致していれば(ソース39行目)次に進めるようです。
challenge = hexlify(os.urandom(1+POWLEN/2))[:POWLEN]そこで、数字のみで0,1,2,…と順にMD5のハッシュ値を計算し先頭5桁と、表示されたchallengeを比較するpythonプログラムを作成します。以下のプログラムを「aaa.py」として保存します。
put('Challenge = %s\n' % challenge)
response = self.rfile.readline()[:-1]
responsehash = hashlib.md5(response).hexdigest().strip()
if responsehash[:POWLEN] != challenge:
put('Wrong\n')
return
import hashlib実行すると、数秒で次のとおり結果が出ます。2029864のMD5ハッシュ値は「19feea32e280740586d9795346b1f99f」なので確かに合っています。
POWLEN = 5
response = 0
challenge = '19fee'
while True:
responsehash = hashlib.md5(str(response)).hexdigest().strip()
if responsehash[:POWLEN] == challenge:
print(str(response) + '\n')
break
response += 1
>aaa.pyこの値を入力するとやはり正解だったようで、次にカンマ区切りで7つの数字が40行表示されます。
2029864
提示されたソースの17~27行目、43~52行目が該当部分です。まず、solutionは0~7の乱数6個から成り(ソース19行目)、これが答えになります(ソース50行目)。次に、表示される7つの数字40行の部分ですが、最初の6つはcoefsという0~7の乱数6個で、7つ目はcoefsとsolutionについて各要素同士の積の和を8で割った余り(ソース23行目)を、ランダムに-1~+1した値(ソース24,25行目)になります。これを40回まわして40行分出力しています。
def learn_with_vibrations():したがって、solutionをランダムに生成し(以下のプログラムでは変数ans)、40行の全てについて、最初の6つの数値とansとで同様の計算をした結果と7つ目の数値との差が-1,0,1のいずれかであれば、変数ansが答えと想定されます。この処理を行う以下のプログラムを「bbb.py」として保存します。
q, n, eqs = 8, 6, 40
solution = [randint(q) for i in range(n)]
equations = []
for i in range(eqs):
coefs = [randint(q) for i in range(n)]
result = sum([solution[i]*coefs[i] for i in range(n)]) % q
vibration = randint(3) - 1
result = (result + q + vibration) % q
equations.append('%s, %d' % (str(coefs)[1:-1], result))
return equations, solution
(中略)
equations, solution = learn_with_vibrations()
for equation in equations:
put(equation + '\n')
put('Enter solution as "1, 2, 3, 4, 5, 6"\n')
sol = self.rfile.readline().strip()
if sol != str(solution)[1:-1]:
put('Wrong\n')
return
import struct実行すると、数秒で次のとおり答えが表示されます。
import os
def randint(bound):
return struct.unpack('<L', os.urandom(4))[0] % bound
equations = [
"2, 2, 3, 2, 3, 4, 2",
"1, 0, 4, 6, 6, 4, 1",
"2, 1, 7, 6, 3, 0, 0",
"5, 6, 1, 4, 2, 1, 2",
"7, 6, 2, 0, 3, 4, 6",
"4, 7, 6, 7, 7, 4, 1",
"2, 5, 2, 7, 6, 4, 4",
"0, 6, 7, 6, 7, 4, 3",
"2, 2, 6, 2, 0, 4, 5",
"1, 4, 6, 7, 4, 3, 0",
"3, 7, 0, 3, 3, 6, 2",
"4, 3, 5, 6, 4, 3, 7",
"3, 5, 0, 1, 6, 0, 5",
"5, 6, 0, 3, 7, 3, 7",
"0, 6, 0, 0, 5, 4, 5",
"0, 1, 5, 2, 6, 4, 1",
"2, 6, 2, 5, 7, 5, 2",
"2, 2, 0, 1, 6, 6, 2",
"0, 4, 4, 4, 4, 6, 2",
"1, 0, 7, 3, 7, 5, 7",
"2, 4, 7, 6, 5, 4, 5",
"5, 7, 4, 7, 3, 4, 7",
"1, 3, 3, 5, 7, 4, 7",
"0, 0, 2, 4, 5, 3, 1",
"5, 2, 3, 5, 0, 0, 2",
"5, 4, 5, 7, 3, 1, 7",
"5, 7, 5, 2, 4, 5, 1",
"1, 3, 3, 4, 0, 2, 6",
"4, 7, 0, 2, 4, 5, 7",
"6, 1, 5, 5, 1, 6, 1",
"5, 0, 4, 4, 1, 6, 0",
"0, 2, 5, 4, 5, 4, 2",
"7, 1, 1, 1, 5, 2, 3",
"4, 6, 0, 2, 4, 5, 4",
"4, 0, 1, 1, 2, 0, 1",
"3, 7, 4, 5, 3, 6, 3",
"0, 7, 7, 5, 6, 7, 4",
"1, 2, 3, 2, 4, 5, 3",
"6, 1, 2, 3, 5, 2, 1",
"5, 1, 5, 0, 3, 7, 1"
]
while True:
ok = 1
ans = [randint(8) for i in range(6)]
for i in range(40):
equ = equations[i]
coefs = equ.replace("L", "").split(",")
result = int(coefs[6])
del coefs[6]
res = sum([ans[j]*int(coefs[j]) for j in range(6)]) % 8
if not ((res + 8 + 1) % 8 == result or (res + 8) % 8 == result or (res + 8 - 1) % 8 == result):
ok = 0
break
if ok == 1:
print ans
break
>bbb.pyこの値を入力すると、フラグが表示されました。
[0L, 2L, 2, 5, 1, 7L]
以下は、実際のコンソールのログです。
>nc.exe bringthenoise.insomnihack.ch 1111フラグは、
Challenge = 19fee
2029864
2, 2, 3, 2, 3, 4, 2
1, 0, 4, 6, 6, 4, 1
2, 1, 7, 6, 3, 0, 0
5, 6, 1, 4, 2, 1, 2
7, 6, 2, 0, 3, 4, 6
4, 7, 6, 7, 7, 4, 1
2, 5, 2, 7, 6, 4, 4
0, 6, 7, 6, 7, 4, 3
2, 2, 6, 2, 0, 4, 5
1, 4, 6, 7, 4, 3, 0
3, 7, 0, 3, 3, 6, 2
4, 3, 5, 6, 4, 3, 7
3, 5, 0, 1, 6, 0, 5
5, 6, 0, 3, 7, 3, 7
0, 6, 0, 0, 5, 4, 5
0, 1, 5, 2, 6, 4, 1
2, 6, 2, 5, 7, 5, 2
2, 2, 0, 1, 6, 6, 2
0, 4, 4, 4, 4, 6, 2
1, 0, 7, 3, 7, 5, 7
2, 4, 7, 6, 5, 4, 5
5, 7, 4, 7, 3, 4, 7
1, 3, 3, 5, 7, 4, 7
0, 0, 2, 4, 5, 3, 1
5, 2, 3, 5, 0, 0, 2
5, 4, 5, 7, 3, 1, 7
5, 7, 5, 2, 4, 5, 1
1, 3, 3, 4, 0, 2, 6
4, 7, 0, 2, 4, 5, 7
6, 1, 5, 5, 1, 6, 1
5, 0, 4, 4, 1, 6, 0
0, 2, 5, 4, 5, 4, 2
7, 1, 1, 1, 5, 2, 3
4, 6, 0, 2, 4, 5, 4
4, 0, 1, 1, 2, 0, 1
3, 7, 4, 5, 3, 6, 3
0, 7, 7, 5, 6, 7, 4
1, 2, 3, 2, 4, 5, 3
6, 1, 2, 3, 5, 2, 1
5, 1, 5, 0, 3, 7, 1
Enter solution as "1, 2, 3, 4, 5, 6"
0, 2, 2, 5, 1, 7
INS{ErrorsOccurMistakesAreMade}
INS{ErrorsOccurMistakesAreMade}です。









