saotake’s blog

-竿竹-

(sCTF2016Q1)解けなかった問題

自分のレベルの低さを再認識した大会でした。趣味の域ですが、どんどん挑戦していきたいです。

 

■Control Panel(40)

ユーザ作成時、burpとかで改行コード入りのユーザ名/パスワードを送ると、改行されてファイル(/etc/passwdと/etc/shadow?)に書き込まれる模様。うまいこと改行コードを駆使してpasswdとshadowにroot権限のユーザを作るのかと思ったが、うまくいかず断念。

 

■President(40)

SQLインジェクション自体はできるのだけど、データを表示することができず、ブラインドインジェクションまでしかできなかった。どこにフラグが保存されているのかわからず断念。

 

■Musical Penguins(45)

ファイルフォーマットからギター楽譜表示ソフトを取ってきて楽譜表示することまではできたが、楽譜が何を意味するか分からず断念。0/1の1bitだと思うのだけど・・・。

(sCTF2016Q1)Secure Text Saver(60)

点数の低い問題から解いているのだけど、そろそろ解けない難易度になってきた。

そんな中、Binary/PWNについては、高得点の問題もなぜか正解数が多い。

というわけで試しにBinary問題を解いてみると、本当に簡単だった。

 

与えられた実行ファイルを実行すると、、、

f:id:saotake:20160413202311p:plain

適当にSignUpすると、任意のテキストを保存できる。

f:id:saotake:20160413202350p:plain

 

問題の意図からして、特定ユーザが保存したテキストを見つける問題らしい。

しかし、自分で保存したアカウントとテキストは、再起動すると消えてしまう。

ということは、ハードコーディングされたプログラムのなかで、どこかでDBにテキストが書き込まれているはず。

 

方針が定まったので、解析開始。ものはjarファイルなので、jarのdisassemblerを探す。

(なぜかdecompilerばかりhitした)

最初にヒットした↓は、一番肝心なloginパネルがエラーとなっており使えず

f:id:saotake:20160413202113p:plain

次にヒットしたのがオンラインデコンパイラ

www.javadecompilers.com

これがとても優秀で、loginパネル部分が見事にデコンパイルされている。

怪しいのが以下の部分

    public static void write() {
        byte[] arr = new byte[]{115, 99, 116, 102, 123, 119, 48, 119, 95, 116, 104, 52, 116, 95, 119, 52, 53, 95, 112, 114, 51, 55, 55, 121, 95, 101, 52, 53, 121, 125};
        accounts.get(0).addText(new String(arr));
    }
}

というわけで、これをアスキーコード変換するとフラグでした。

(sCTF2016Q1)rev2(45)

rev1とほぼおなじじゃん・・・。

hopperでdisassembleして比較文見つけて終わり。

0000000000400687 call scanf@PLT
000000000040068c mov eax, dword [ss:rbp+var_8]
000000000040068f cmp eax, 0x30dda83
0000000000400694 jne 0x400711

点数が低い問題から見ていってて、

難しくなってきて解けなくなってきたなぁと思ってたのに、

Binaryはこのレベルなんでも難しいってことなんですかね。

 

むしろrev1はどうやってもっと簡単にとけたのだろう?

確かにrev1はflag文字列が難読化されてなくて読めちゃうけど、

そこ読むよりmagic numberというのを探したほうが早いよね・・・?

(sCTF2016Q1)Musical Penguins(45)

解けなかった。

 

バイナリエディタで開くとそのままファイルフォーマットが書いている優しい世界。

f:id:saotake:20160412174819p:plain

ダウンロードしたら最新版だけダウンロード数が桁違いで笑ってしまう。

f:id:saotake:20160412175224p:plain

ダウンロードしたソフトでファイルを開くとギターの譜面がでて、いかにも1音が0/1の1bitを現しているように見えるが、解けなかった。1桁目が0でほぼ固定なので、何か別の意味・・・?

 

 

(sCTF2016Q1)Rain or Shine(35)

最初はさっぱりわからず。

それぞれの音の下位1bitを取り出したらflagになるのかな?と思いつつ、pythonに食わせようとするとエラーになった。どうもwavとして破損(?)している模様。

 

しょうがなくぼーっとBinaryを見ていくと、0058FC00あたりまではWAVっぽいデータがならんでいるのだが、その後何かバイナリの様子が変わる。

f:id:saotake:20160411223911p:plain

 

さらに続きを読むと、adobeの文字が。

f:id:saotake:20160411224143p:plain

明らかに00の繰り返しが終わる部分の、次の先頭文字列[49 49 2A]でググると、tiffのヘッダらしい。というわけで、[49 49 2A]以降を別のファイルにしてオワリ!

 

と思いきや、QRコードが4分割された画像ファイルが出てきた。

f:id:saotake:20160411224429p:plain

こんなのもういいじゃん・・・。どうせ単純に並べ替えるだけだと思ったら・・・。

f:id:saotake:20160411232913p:plain

ん?元画像でいうところの左上ブロックが、1列・1行たりない・・・。

「これ総当たりすんの、まじかよ!」と思ったら、よ~く元の画像をみると、下1行については、2dotくらいだけ映ってる。補完してやると、、、

f:id:saotake:20160411233046p:plain

残り1列は結局わからなかったけど、この状態でQRリーダで読めました。

(sCTF2016Q1)rev1(20)

デコンパイルができれば終わりな問題。

 

user@ubuntu:~/Desktop$ file rev1
rev1: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=82958aa51b05984108d0808209174e172dbf4338, not stripped
user@ubuntu:~/Desktop$

 

 

例のごとく、64bitELFなので、IDA Pro(Free)先生では解析できない。

誰かWindowsでいいフリーのdeassenmber教えて・・・。

 

結局はUbuntuでHopperなんだよなぁ・・・。

0000000000400692 call scanf@PLT
0000000000400697 mov eax, dword [ss:rbp+var_4]
000000000040069a cmp eax, 0x5b74
000000000040069f jne 0x4006b7

 入力値を0x5b74(=23412)と比較してるので、23412をいれておわり。

ところで、Win10の電卓って見た目かなり変わったんですね。

(sCTF2016Q1)Lengthy Lingo(35)

こういう閃き系の問題は解けると嬉しいけど解けないと時間が無限に消えますね。

数字の桁数をASCIIコード解釈すればOK。CSVなのでエクセルに食わせて、

=CHAR(LEN(A1))

で解けました。スペースまでカウントしてしまわないように(1敗)。