⇤ ← 2014-12-07 19:16:59時点のリビジョン1
サイズ: 1242
コメント:
|
← 2014-12-07 19:37:13時点のリビジョン2 ⇥
サイズ: 1259
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 1: | 行 1: |
== Let's disassemble == | == Let's disassemble (Reverse 200pts) == |
Let's disassemble (Reverse 200pts)
降ってくるバイナリ列は長さが可変なので、可変長の命令を持つCPUであることが分かる。 ytokuさんがいろいろ頑張ってz80だと特定したので、z80の逆アセンブラを探して、 結果を送信するプログラムを作成した。
1 require_relative 'ctf'
2 TCPSocket.open('disassemble.quals.seccon.jp', 23168) do |s|
3 s.echo = true
4 for i in 0...100
5 File.binwrite('tmp.bin', s.read_until(/\?/)[0..-2].split(/:/)[1].split.map{|a|a.to_i(16)}.pack("C*"))
6 c2 = `z80dasm tmp.bin`.lines[5].chomp
7 unless c2.include?('def')
8 s.print c2
9 else
10 system "dz80 -n tmp > /dev/null"
11 s.print File.read('tmp.z80').lines[6].strip.split.join(' ') + "\n"
12 end
13 s.flush
14 end
15 s.interactive!
16 end
aptに含まれていた、z80dasmとdz80という逆アセンブラを用いたのだが、dz80は割と良く、z80dasmはたまに逆アセンブルに失敗することが分かった。 なので、z80dasmが失敗した時のみdz80を使うようにしたら、フラグを得ることが出来た。
$ ruby solve.rb (中略) The flag is SECCON{I love Z80. How about you?}