しゃろの日記

CTFのwriteup置き場になる予定(`・ω・´)

TrendMicroCTF 演習問題2 Air on G String writeup

先日、TrendMicroCTFからCryptoの演習問題が2問公開されました。

そのうちの1問である"Air on G String"が解けたので、writeupを置いておきます(`・ω・´)


MIDIファイルが与えられる。

再生してみるとG線上のアリアが流れるが、ピアノが不協和音を奏でている。

Music Studio Producerで開くとこんな感じ。
f:id:Charo_IT:20150913205346p:plain

各チャンネルの役割は

CH #1: 第1バイオリン
CH #2: 第2バイオリン
CH #3: ビオラ
CH #4: 不協和音を奏でるピアノ
C, T, F: ノートはあるが無音

となっていた。

CH #4をピアノロールで見るとこんな感じ。
f:id:Charo_IT:20150913210220p:plain

CH #4とチャンネルC, T, Fを見比べてみる。
f:id:Charo_IT:20150913210330p:plain (左がCH #4、右がC, T, Fチャンネルを重ねて表示したもの)

よく見てみると、赤線で囲った部分の音が同じになっている。

ここから、CH #4は1拍で1文字を表していると予想することができる。

TrendMicroCTFの問題で"○○CTF"から始まる文字列、となると、最初の5文字は"TMCTF"となるのでは? とすぐ思いつくが……
f:id:Charo_IT:20150913224339p:plain
1拍目と4拍目はどちらも"T"を表しているはずなのに音が違う。

しかし、よく見ると和音の構成音が同じになっている。

1拍目: レ + ラ + ド + ミ → ミ + ラ
4拍目: ラ + ド + ミ + レ → ラ + ミ

ここからどうやったら0x54("T")が作れるかと試行錯誤した結果、

レ + ラ + ド + ミ
→D + A + C + E
→0xd ^ 0xa ^ 0xc ^ 0xe = 0x5

ミ + ラ
→E + A
→0xe ^ 0xa = 0x4

(0x5 << 4) | 0x4 = 0x54 = 'T'

和音の構成音の音名をアメリカ式(C, D, E, F, G, A, B)に直し、それを16進数とみなしてxorを取ったものを作ればいいことに気付いた。

ここまでくればあとはやるだけ。

chords = %w(ecad ea ea d bf ed aced ae ae ac ad b ae ce ca ab ca cf ca eca df aa bf ab cb ec db ceb ca be ce aa db cd bc dace ac ac df ee ea da da d)

hex = chords.map{|a|
    a.chars.map{|c| c.to_i(16)}.inject(:^).to_s(16)
}.join

puts hex
puts [hex].pack("H*")
#=> 544d4354467b4261636820417269652061756620477d
#=> TMCTF{Bach Arie auf G}

FLAG:TMCTF{Bach Arie auf G} (まんまやんけ……)