TrendMicroCTF 演習問題2 Air on G String writeup
先日、TrendMicroCTFからCryptoの演習問題が2問公開されました。
そのうちの1問である"Air on G String"が解けたので、writeupを置いておきます(`・ω・´)
MIDIファイルが与えられる。
再生してみるとG線上のアリアが流れるが、ピアノが不協和音を奏でている。
Music Studio Producerで開くとこんな感じ。
各チャンネルの役割は
CH #1: 第1バイオリン CH #2: 第2バイオリン CH #3: ビオラ CH #4: 不協和音を奏でるピアノ C, T, F: ノートはあるが無音
となっていた。
CH #4をピアノロールで見るとこんな感じ。
CH #4とチャンネルC, T, Fを見比べてみる。
(左がCH #4、右がC, T, Fチャンネルを重ねて表示したもの)
よく見てみると、赤線で囲った部分の音が同じになっている。
ここから、CH #4は1拍で1文字を表していると予想することができる。
TrendMicroCTFの問題で"○○CTF"から始まる文字列、となると、最初の5文字は"TMCTF"となるのでは? とすぐ思いつくが……
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}
(まんまやんけ……)