Login
Immutable PageDiscussionInfoAttachments
CTF/Writeup/SECCON 2014 Quals Online Winter/Let's disassemble

MMA

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に含まれていた、z80dasmdz80という逆アセンブラを用いたのだが、dz80は割と良く、z80dasmはたまに逆アセンブルに失敗することが分かった。 なので、z80dasmが失敗した時のみdz80を使うようにしたら、フラグを得ることが出来た。

$ ruby solve.rb
(中略)
The flag is SECCON{I love Z80. How about you?}

CTF/Writeup/SECCON 2014 Quals Online Winter/Let's disassemble (last edited 2014-12-07 19:37:13 by nomeaning)