煙と消えるその前に

一服してるうちに忘れる、自分のための備忘録。とかとか

SECCON 2013 CTF オンライン予選に参加してみた

気づけば1週間も経ち、若干いまさら感がありますが記録がてら書きます。
SECCONなにそれおいしいの?な自分が、誘われるままにSECCON 2013 CTF オンライン予選に参加してきました。
いずれも初参加の4名が、Route9というチームで参加。
成績は324チーム中53位!(棄権チーム含むけど...)
初めてにしてはがんばった気がするなーと思いつつ、私が解いた/解けそうで解けなかった問題を挙げておきます。

公式サイト:

解いた問題(他にも手をつけたけど解答まで辿りつけず...):

  • ネットワークWeb 200点 FindTheKey
  • ネットワークWeb 300点 hidden message

ネットワークWeb 200点 FindTheKey

seccon_q1_pcap.pcap(保存期間7日間なので消えてるかも) というファイルが添付されていて、そこから鍵を探す問題。

とりあえずwiresharkにくわせてみると、pingのパケットが出てきました。
なんだこれーと思いながら眺めてると、http通信しているログが・・・。

f:id:paty_fakename:20140202152847p:plain

どうやらkagi.pngという画像をHTTP GETしているみたい。
そのものずばりこのpngを復元すれば鍵が手に入るのかなと、バイナリデータを引っこ抜いてみます。
pngのフォーマットは"89 50 4E 47 0D 0A 1A 0A"から始まって"00 00 00 00 49 45 4E 44 (ここに4バイト)"で終わるそうです。
それっぽいところを探すと、No44-48にかけてビンゴなバイナリが見つかるので、それを抜き出して繋ぎ合わせてみます。
繋いだものを開いてみると・・・

  • 1つ目のレスポンス郡(pcap No 44-48)

f:id:paty_fakename:20140202154858j:plain
お、おう・・・。まさかこれで答えがわかるなんて思ってなかったけど、そう来たかーな感じ。
どうも壊れた画像?を取っていたパケットのようですね。
じゃあ次どうしたものかとseccon_q1_pcap.pcapを眺めていると、kagi.pngを取ってるログがいくつかありました。
壊れた画像のレスポンスは 200 OKで画像丸ごと返してる。次のレスポンスは206で部分的に返してる。そんな感じでレスポンスが5つほどありました。
ははーん、部分的にちゃんとした画像を返して繋ぎ合わせろってことか、と思いバイナリエディタで順に切り貼りしていきます。

  • 2つ目のレスポンス郡(pcap No 58)

Content-Range: bytes 2572-2794/2795とあるので、画像ファイルの2572バイト目(0xac0)からをレスポンスのバイナリで上書きしてみたけど・・・画像変わらず
くじけず次へ。

  • 3つ目のレスポンス郡(pcap No 70-73)

1つ目と同じようにkagi.pngを丸ごと取得していましたが、1つ目の画像から進展なし。

  • 4つ目のレスポンス郡(pcap No 87-89)

Content-Range: bytes 768-2794/2795だそうで、768バイト目(0x300)から上書きしてみます。
すると・・・、おーなんか見えた!これだけでなんとか分かりそうだけど、せっかくなので最後まで復元してみます。

f:id:paty_fakename:20140202165039j:plain

  • 5つ目のレスポンス郡(pcap No 105-107)

Content-Range: bytes 1487-2794/2795なので、1487バイト目(0x5cf)から上書きしてみます。
これで完全に復元できました。keyは"deadbeeffeedbad"となります。

f:id:paty_fakename:20140202165433j:plain

ネットワークWeb 300点 hidden message

q.jpg(保存期間7日間なので消えてるかも)というファイルが添付されていて、そこから鍵を探す問題。
jpgファイルだし、とりあえずバイナリエディタにくわせてみました。
上からつつーっと眺めてみると、末尾に変な文字が。

134.133.95.10in-addrarpa

お?と思い、jpegの画像フォーマットを調べてみると、開始がFFD8、終了がFFD9とのことで、どうも終了マーカの後にこんなバイナリが付属しているようです。

D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00 FF FF 00 00 01 00 00 00 AE 39 E1 52 7D 9F 06 00 56 00 00 00 56 00 00 00 9C A3 BA 29 77 57 70 81 05 EC C7 7F 08 00 45 00 00 48 E5 2E 00 00 35 11 38 F2 CA D2 DE C3 85 F2 37 FC DE 5B 00 35 00 34 B0 23 1F CB 01 00 00 01 00 00 00 00 00 00 03 31 33 34 03 31 33 33 02 39 35 02 31 30 07 69 6E 2D 61 64 64 72 04 61 72 70 61 00 00 0C 00 01

けど何のバイナリかわからないしなー、困ったなーとなったところで、とりあえずヘッダっぽい先頭4バイト"D4 C3 B2 A1"をgoogle先生に問い合わせてみることに。
すると、どうやらこれはpcapファイルとのこと。google先生さすがです。

ということで、該当バイナリだけ切り出してwiresharkにくわせてみます。
すると、DNS問い合わせをしたらしきパケットが見つかります。
f:id:paty_fakename:20140202171653p:plain

正直、でっていう感だったわけですが、とりあえずDNSに問い合わせてみるかーということでやってみました。

dig -x @133.242.55.252 134.133.95.10

が、応答かえってこず!えーなんでー。実はダミーバイナリでJPEGの中に隠れたメッセージがあるとか??なんて考えてたけど結局わからず。

後から調べてみたところ、オプション書く位置がまずかったとのこと・・・orz

dig @133.242.55.252 -x 134.133.95.10

実際には確認できてないのですが、
期待通りなら"You.G0t.a.H1dd3n.m3ss4g3.1n.Th15.DNS."が取れて、これがkeyになるとのこと。
後一歩だっただけに悔しい。

git logのオプションあれこれ

普段何気なくgit log叩いてるけど、実はオプションが多くて驚いた。
自分的に使えそうなものをメモしておく。

僕の考えた最強のry

色々調べた結果、自分で使うならこんなところかなーという結論に至った

$ git log --graph --name-status --pretty=format:"%C(red)%h %C(green)%an %Creset%s %C(yellow)%d%Creset"

そのまま使うには長すぎるのでエイリアスにしておく

$ git config --global alias.mylog 'log --graph --name-status --pretty=format:"%C(red)%h %C(green)%an %Creset%s %C(yellow)%d%Creset"'

以下、git logのオプションあれこれ

表示するコミット数を制限する -n num / -num
$ git log -n 5
$ git log -5
各コミットのdiffを表示する -p

オプション無しだとコミットID、Auithor、Date、コミットメッセージだけの表示だが、-pをつければ変更されたdiffも表示される

$ git log -p
commit 7a3b16394b8164ef708caa5686f4cced9f976a0e
Author: EC2 Default User <ec2-user@ip-10-132-178-74.ap-northeast-1.compute.internal>
Date:   Tue Jul 16 02:50:05 2013 +0900

    second?

diff --git a/first.txt b/first.txt
index 5ec586d..31ad3ce 100644
--- a/first.txt
+++ b/first.txt
@@ -1 +1,2 @@
 first commit
+second
コミットIDを短縮表示 --abbrev-commit

SHA-1が長くてやだなーと思ったときに

マージコミットを表示しない --no-merges

リリース用ブランチとかけっこうマージコミット多いんだよね...

ログを1行表示にする --pretty=oneline / --oneline

正しくは--pretty=onelineが1行表示で、--onelineは--pretty=oneline --abbrev-commitと同じ意味らしい

$ git log --pretty=oneline
7a3b16394b8164ef708caa5686f4cced9f976a0e second?
$ git log --oneline
7a3b163 second?
ブランチやタグ名を追記 --decorate

個人的に無名ブランチ切った時にどこのブランチ派生か確認したりする

グラフ表示 --graph

マージした後の確認に便利・・・かな?
--onelineと組み合わせると読みやすい

*   commit 34331a8c5f761489baf151d97ae9e40702325164
|\  Merge: 3756bff 7a3b163
| | Author: EC2 Default User <ec2-user@ip-10-132-178-74.ap-northeast-1.compute.internal>
| | Date:   Tue Jul 16 03:07:35 2013 +0900
| |
| |     Merge branch 'feature'
| |
| * commit 7a3b16394b8164ef708caa5686f4cced9f976a0e
|/  Author: EC2 Default User <ec2-user@ip-10-132-178-74.ap-northeast-1.compute.internal>
|   Date:   Tue Jul 16 02:50:05 2013 +0900
|
|       second?
|
* commit 3756bfff44b99e56da2182521f0b0d07af940323
コミットによる変更ファイルと変更方法だけ表示 --name-status
$ git log --name-status
commit 7a3b16394b8164ef708caa5686f4cced9f976a0e
Author: EC2 Default User <ec2-user@ip-10-132-178-74.ap-northeast-1.compute.internal>
Date:   Tue Jul 16 02:50:05 2013 +0900

    second?

M       first.txt

--onelineと組み合わせると読みやすい感じ

$ git log --name-status --oneline
7a3b163 second?
M       first.txt
2つのブランチ間で異なるコミットだけ出力

できることを知らなかった!
2つのブランチを..でつないで指定するだけ
どちらのブランチに含まれるコミットかを出すなら --left-rightオプションを付ける

$ git log --left-right master..feature
commit > 7a3b16394b8164ef708caa5686f4cced9f976a0e
Author: EC2 Default User <ec2-user@ip-10-132-178-74.ap-northeast-1.compute.internal>
Date:   Tue Jul 16 02:50:05 2013 +0900

    second?
特定Authorのコミットだけを表示 --author=regexp

grepするなんて格好悪い真似はもうしないっ

$ git log --author=ec2-user
ログ出力フォーマットの指定 pretty=format:"(format)"

フォーマット指定でログ出力する方法。出力を指定するオプションがいくつかあるけど、使いそうなのは以下かなぁ

%H      コミットのハッシュ
%h      コミットのハッシュ (短縮版)
%ad     Author の日付
%an     Author の名前
%ar     Author の相対日付
%s      コミットメッセージ
%d      ブランチ/タグ名
%C([color]) これ以降の出力をcolorに変える
   [color] = ["Black","Red","Green","Yellow","Blue","Magenta","Cyan","White"]
%Creset これ以降の出力をデフォルトに戻す

こんな感じに出力される

$ git log --pretty=format:"%h - %an, %ar : %s"
34331a8 - EC2 Default User, 8 minutes ago : Merge branch 'feature'
7a3b163 - EC2 Default User, 25 minutes ago : second?

gitディレクトリで現在のブランチを表示する

毎回git branch叩いて確認するのもどうかと思って、なんとかならないかなーと調べたらあった。
以下のサイトを参考にさせていただいて、設定をしてみた

環境

やりかた

ログインユーザの~/.bashrcに以下を追加
(環境変数のことよくわかってないので、困った時に調べる...)

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
function proml {
  PS1="[\u@\h \W]\$(parse_git_branch)\$ "
}
proml

sourceコマンドで反映させるとこんな感じ

[ec2-user@ip-xxxx ~]$ source ~/.bashrc
[ec2-user@ip-xxxx ~]$ cd my_repo/
[ec2-user@ip-xxxx my_repo](master)$