SECCON 2015 Write Up
SECCON 2015オンライン予選にRoute9チームで参加してきた。結果は99位。みんなすごいなぁという感じで面白かった。
以下、解いた問題に関する記録。
Exec dmesg
問題文
秘密のメッセージをLinuxのisoイメージの中から見つけてください。
記録
以下のようにして解いた。
- 問題文がexec dmesgなのでDLしたイメージをvirtualboxで起動してdmesgすると、dmesg: applet not foundとか言われる
- /var/log/messageみたいなものは存在しない
- dmesgが該当するかは知らなかったが、busyboxが面倒を見てるコマンドかもしれないのでls -l /bin/dmesgするとbusyboxへのsymlink
- busybox lsなどはできるがbusybox dmesgだとapplet not foundのためbusyboxに細工がしてあると推測
- strings busybox すると確かにdmesgがない(lsとかcatとかはあるのでここでなにか不要なコマンドをdmesgに置き換えてみる事にした)
- 手元の環境でstrings busyboxするとdmesgが存在した
- 5.の時に辞書順に並んでるコマンド郡の中でdmesgっぽい位置にあるenfth*1にとりあえず狙いを定める
- hexdump busyboxして置き換えるコマンドの位置を調べる(0x68b52(=428882)の位置を書き換えることにする
- sudo cp /bin/busybox /bin/busybox.new*2
- echo -n "dmesg" | sudo dd of=busybox.new bs=1 seek=428882 conv=notrunc
- busybox.new dmesg
- 結果の中にSECCONで始まる文字列がないか見る: SECCON{elf32-i386}
5.の辺りで以下のようなので、0x68b50=428880。+ 2バイトかな?という感じ。
$ hexdump busybox ... 00068b50 e.enfth.dnsdomain ...
しぶい問題だった。しかし、置き換えた後で思ったけどその辺からbusybox取ってきても良かったんじゃないだろうか?でも実は更にgrepだけして即回答してる人もいるみたいなので上には上がいるなぁと思った。
4042
問題文
謎の文章が2005年に古代遺跡から発見された。 これは何を意味している?
記録
- 4042と2005とくれば「RFC4042の事だ...」という感じでチームメンバが疑い始める*3
- no-network.txtというファイル名からRFC4042中のnonetの事だろうなぁという事で「絶対RFC4042の事だ...」と思う
- 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)