rogyCTF部です。

SECCON 2015の予選にチームz_kro (z_kroさんは居ない)として(@yosupot @ymduu)の二人で出ていました。
結果は30位(国内:12位)で、決勝(intercollege)に出られるらしいです。やったぜ。


・Start SECCON CTF/Last Challenge (Thank you for playing)
簡単な換字式暗号なのでpythonにぶち込んで置換できる。

>>> import string
>>> src="A}FFDNEVPFSGV}KZPN}GO"
>>> dst = src.translate(string.maketrans('PXFR}QIVTMSZCNDKUWAGJB{LHYEO', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}'))
>>> dst
'SECCON{HACKTHEPLANET}'
>>> src="A}FFDNEA}}HDJN}LGH}PWO"
>>> src.translate(string.maketrans('PXFR}QIVTMSZCNDKUWAGJB{LHYEO', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}'))
'SECCON{SEEYOUNEXTYEAR}'
>>>


・SECCON WARS 2015

20枚ほどスクリーンショットを取って黒い部分の積集合を取った。
以下のようになった。

img
これを携帯で読み込んでOK


・Unzip the file

パス付きzipが降ってくる。中身を見るとbacknumber08.txt,backumber09.zipなどが見える。それでググるとSECCONのメルマガが引っかかるので plaintext attackかなあなどと思う。それを使ってpkcrackでdecryptした。なぜかzip圧縮したものを平文として渡さないと上手くいかずちょっとハマった。

・Reverse-Engineering Android APK 1
Androidのapkが降ってくる。
デコンパイルしても良いんだけど、100点なのでどうせ不正防止などはされていないだろうと考え、スマホゲーム不正中学生ツールであるところのgamekillerで勝利回数を書き換えた。
勝利回数を999にしてそこから一回勝つとフラグが出た。



・Reverse-Engineering Hardware 1

最初の1周期は変な挙動をするため動画だけで解くことはできない。
回路自体はさして難しくないけど写真から配線を追うのは思ったより大変だった。


・Reverse-Engineering Hardware 2

この問題だけは問題順を無視してここに。

1よりも回路が格段に綺麗なので読みやすいです。

本質はcarryが1111->0000ではなく1110->1111で立ち上がるということに気付けるかどうか。


シュミレーションのコード
hard1.cpp (hard1/2両方のコードがあります)


・Connect the server
通信内容をFiddlerでみたらフラグが降ってきていた(Fiddlerは神)

・Exec dmesg
名前通りdmesgを実行すればよいのかなと思ったが、なんだかエラーが出て実行できない。
Ubuntuから引っこ抜いたdmesgをブチこめば出来るのではないかとの見通しを立てるも、CUIのVMのLinuxにファイルを入れる方法がわからなくてとても辛かった。(Vmware tools入れようとしたら容量が足りないだのなんだの怒られてブチギレ)
結局適当なアップローダにUbuntuのdmesgを上げてそこからwgetして入れることに成功した。
dmesgさえ実行すればgrepなり目grepなりで旗が手に入る。


・Decrypt it
基本的にはbase64なんだけど変な操作がされている。
よくわからないが先頭から貪欲に決めればよいだけ。なんで300ptなんだろう

decrypt.d


・Find the prime numbers

変な問題。式を適当にいじると答えが出る。

$c \equiv (n+1)^v * x^n$
$o \equiv (n+1) * x^n$
$h \equiv (c*o)$

の3つの数が与えられる。(この問題については剰余系の法はすべて $n^2$ です。)

ただしnはなんらかの素数を2つかけたもの、xは乱数, vは秘密の数字。
vを求めよという問題。

まず、

$(c * o - h) = k*n^2$

より、$c*o - h$をpari/GPに突っ込み $n$ とそれを構成する素数を得ます。

その後、二項定理より

$c \equiv ((n+1)^v * x^n) \equiv (vn + 1) * (x^n)$

であることを考えます。

$n+1$の逆元は簡単に求まるので$o$より、$x^n$の逆元も求まります。

よってこれをかければ$vn+1$も求まります。なので$v$が求まります。終わり。


・Micro computer exploit code challenge

AVRに人生で初めて触れました。

ヒイヒイ言いながら読んでいくと、脆弱性は自明なスタックオーバーフローがあるのですが、それだけではだめ。
なぜならAVRはRAMとROMが完全に分割されているので、スタックを書き換えたところで任意コードが実行できない。

ですがレジスタの指す値のROMを読んでそのレジスタをインクリメントする関数が用意されていたので、そこを読みたいアドレスに行き着くまで呼び出しまくったら無事flagが入手できました。

・FSB: TreeWalker

頑張ってバイナリを読む問題。
どうやら文字を入力してそれをそのままprintfしてくれる。なのでFormat String Attackが可能。
struct Node {
int type;
Node* l;
Node* r;
}
みたいなのが(flagの文字数)*8個繋がっていて、
  • 対応するbitが1ならlが次のノード, rがNULL
  • 対応するbitが0ならrが次のノード, lがNULL
となっています。これを順に辿っていくだけ。
個人的にはこれをTreeと呼ぶのは???なのですが…


・Steganography 1
バイナリエディタで見ると画像ファイルがなんだかたくさんくっついていることがわかった。
始め「gpjb」の意味に気づかず、「strings -a MrFusion.gif | grep -e IHDR -e GIF -e JFIF 」としてBMPを見逃してしまい辛かった。
各画像ファイルの順番が分かったらバイナリエディタで手動で削っていった。

・Steganography 3
OCRにバイナリ部分を食わせてバイナリを実行したら旗が出ると確信し頑張ってOCRに食わせたが、「flood fill」的な文章をb64encodeした文字列が出るだけでフラグではなかった。(かなしい)
flood fillの意味をググってペイントでバイナリエディタ部分に黒色をブチまけたらフラグが見えた(ブチギレ)

・4042
4042 2005 で検索すると、RFC4042がヒットする。
0-7しか無い、などの理由からこれの8進表現なんじゃないかなあ、などと思い、http://www.kt.rim.or.jp/~ksk/joke-RFC/rfc4042j.txtなどをslackに上げたらよすぽがデコーダを書いてくれた。

(Unsolved)--------------------------------------------------------------------------------------------------------------------------------------
・QR puzzle (Windows)(Unsolved)
まずはwinバイナリなのでメモリエディタで不正を試みた。結果、不正検知システムがあるのか、正解数が300を越えた場合は解答欄に入力ができなくなり、ピッタリ300になった場合はプログラムが落ちた。
もっとメモリを見ると、1400個弱の辞書がメモリ上に平文で置いてあることがわかったので、sikuliX(ダブステップが上手そう)で自動化して総当りを試みた。が遅すぎて終わらず断念。
QRコードの切り方は一定なので、画像処理でうまいことパズルのソルバが書けるんじゃないか、と思うも技術力が足りず断念。
プログラムの出力をGUIに投げられれば総当りでも間に合うんじゃないか、と思うも技術力が足りず断念。二日目起きてからずっとこれと格闘していたのに解けずとてもつらかった。