SECCON 2015 Write Up

SECCON 2015オンライン予選にRoute9チームで参加してきた。結果は99位。みんなすごいなぁという感じで面白かった。

以下、解いた問題に関する記録。

Exec dmesg

問題文
秘密のメッセージをLinuxのisoイメージの中から見つけてください。
記録

以下のようにして解いた。

  1. 問題文がexec dmesgなのでDLしたイメージをvirtualboxで起動してdmesgすると、dmesg: applet not foundとか言われる
  2. /var/log/messageみたいなものは存在しない
  3. dmesgが該当するかは知らなかったが、busyboxが面倒を見てるコマンドかもしれないのでls -l /bin/dmesgするとbusyboxへのsymlink
  4. busybox lsなどはできるがbusybox dmesgだとapplet not foundのためbusyboxに細工がしてあると推測
  5. strings busybox すると確かにdmesgがない(lsとかcatとかはあるのでここでなにか不要なコマンドをdmesgに置き換えてみる事にした)
  6. 手元の環境でstrings busyboxするとdmesgが存在した
  7. 5.の時に辞書順に並んでるコマンド郡の中でdmesgっぽい位置にあるenfth*1にとりあえず狙いを定める
  8. hexdump busyboxして置き換えるコマンドの位置を調べる(0x68b52(=428882)の位置を書き換えることにする
  9. sudo cp /bin/busybox /bin/busybox.new*2
  10. echo -n "dmesg" | sudo dd of=busybox.new bs=1 seek=428882 conv=notrunc
  11. busybox.new dmesg
  12. 結果の中にSECCONで始まる文字列がないか見る: SECCON{elf32-i386}

5.の辺りで以下のようなので、0x68b50=428880。+ 2バイトかな?という感じ。

$ hexdump busybox
...
00068b50 e.enfth.dnsdomain
...

しぶい問題だった。しかし、置き換えた後で思ったけどその辺からbusybox取ってきても良かったんじゃないだろうか?でも実は更にgrepだけして即回答してる人もいるみたいなので上には上がいるなぁと思った。

4042

問題文
謎の文章が2005年に古代遺跡から発見された。
これは何を意味している?
記録
  1. 4042と2005とくれば「RFC4042の事だ...」という感じでチームメンバが疑い始める*3
  2. no-network.txtというファイル名からRFC4042中のnonetの事だろうなぁという事で「絶対RFC4042の事だ...」と思う
  3. no-network.txtの中身を3文字ずつにしてRFC4042中の関数を使って読んでみるとSECCON{A_GROUP_OF_NINE_BITS_IS_CALLED_NONET}が取れる

なお、以下のような感じで作った。pack("U")してるけど、UTF-8じゃないのでまぁ化けるよねという感じだが100点なのでそんなに頑張らなかった。一応iconv -f UCS-4 -t UTF-8して失敗するのでfrom辺りが間違ってるかpack("U")してるのが問題かだと思うんだけどそこまでとした。

def digits_to_utf9_no_nets(s)
  return s.delete("\n").chars.each_slice(3).collect {|n| Integer("0" + n.join) }
end

def utf9_nonets_to_ucs4(no_nets)
  res = ""
  while !no_nets.empty? do
    no_net = no_nets.shift
    ucs4 = no_net & 0xff
    while (!no_nets.empty? && (no_net & 0x100) != 0) do
      ucs4 <<= 8
      no_net = no_nets.shift & 0xff
      ucs4 |= no_net
    end
    res << [ucs4].pack("U")
  end
  return res
end

no_nets = digits_to_utf9_no_nets(File.read('no-network.txt'))
puts utf9_nonets_to_ucs4(no_nets)

*1:後で気付いたけど、enfthはdmesgの一文字ずらしか。ヒントだったらしい

*2:最初は直接書き変えようと思ったけどbusyboxだから失敗したら何もできなくなる可能性があるので、cpして書き換える事にした

*3:良く知ってるねみんな