2013年10月9日水曜日

RXでアセンブラ短歌

SECCONで解けなかった問題。

RXでアセンブラ短歌(プログラミング:100pt)


下記の短歌を詠んだ結果、出力される文字列を答えよというもの。

FB 7E 67 6D 62
FB 62 15 08 0C 65 03
FC 37 67 7E A7
66 11 66 43 66 55 03
EF 02 75 60 FF 67 01

RXというのはルネサスというメーカが出しているマイコンファミリの事らしい。

RX ファミリ | ルネサス エレクトロニクスhttp://japan.renesas.com/products/mpumcu/rx/index.jsp

知らなかった。


RXとして動かす方法はいろいろあるみたいだけど、自前でgccやgdbをRX向けにmakeする方法がなかなかうまくいかなかった。

結局、KPIT GNU Tools(http://www.kpitgnutools.com)というところからGNURX v13.01 Linux Tool Chainをダウンロードした。


短歌をアセンブラソースファイルに書く
$ cat tanka.s
.section .text
.global _main
.type _main, @function
_main:
.byte 0xFB
.byte 0x7E
.byte 0x67
.byte 0x6D
.byte 0x62
…以下略

続いてrx-elf向けのgccでコンパイル
$ rx-elf-gcc tanka.s -o tanka.o

rx-elfとして実行する
$ rx-elf-run ./tanka.o
rene

答え(多分):rene


ルネサス(renesas)の頭4文字だということであれば納得。

また、短歌を書き込んだバイナリをobjdumpで見てみると、0x626d67と0x650c0815のxorを取って出力しているっぽい。0x656e6572はリトルエンディアンで"rene"。
$ rx-elf-objdump -b binary -m rx -D tanka
tanka:     ファイル形式 binary

セクション .data の逆アセンブル:
00000000 <.data>:
   0: fb 7e 67 6d 62                 mov.l #0x626d67, r7
   5: fb 62 15 08 0c 65             mov.l #0x650c0815, r6
   b: 03                             nop
   c: fc 37 67                       xor r6, r7
   f: 7e a7                         push.l r7
  11: 66 11                         mov.l #1, r1
  13: 66 43                         mov.l #4, r3
  15: 66 55                         mov.l #5, r5
  17: 03                             nop
  18: ef 02                         mov.l r0, r2
  1a: 75 60 ff                       int #255
  1d: 67 01                         rtsd #4


実行や逆アセンブルできる環境を整えるまでが大変だった。

2013年10月6日日曜日

SECCON 2013 福岡大会 Write-up

SECCON 2013 福岡大会にチームINFOGRAMとして参加してきました。

3人チームで出場するはずでしたが、チームメイトの1人が大会直前で脱臼したので、2人で挑みました。

結果、なぜか優勝してしました。

Write-upというものを書くのが通例みたいなので、解けた問題だけ書きたいと思います。

どっち派?(その他:100pt)


最初の正解者でした(たぶん全チーム中最初のポイントであったとも思う)。

下記の文字列が与えられた。
jj jlk_hjljh_hjlhjl hklhkl_kljklj_kkljhlj_hjl_hjljh llhjj_kljh_jlkh
jとkとlとh…これviや…(ここまで5秒)

「j」を「↓」、「k」を「↑」、「h」を「←」、「l」を「→」に置き換えた
↓↓ ↓→↑_←↓→↓←_←↓→←↓→ ←↑→←↑→_↑→↓↑→↓_↑↑→↓←→↓_←↓→_←↓→↓← →→←↓↓_↑→↓←_↓→↑←
そのまま右手にペンとノートを持って人間コマンド入力したら



最初は「I uSE EmAcS Too」やら「IuSEEmAcSToo」をsubmitしていたが通らなかった。
最終的にアンダースコアを入れて正解だった気がする

答え(確か):I u_S_E E_m_A_c_S T_o_o

ちなみに僕はvi派です。Emacsはよく知りません。


decrypt(その他:100pt)


これも最初の正解者でした。

下記の文字列が与えられた。

Szylrow lfw Xbzk hc z lozahlhqjzb qrlaqqo cyqol kwjwozbbm ybzmwa tm sfhbaowj, pfwow lpq lwzuc wzsf fzgw z xbzk (qo qlfwo uzoiwo) zja lfw qtvwslhgw hc lq szylrow lfw qlfwo lwzu'c xbzk, bqszlwa zl lfw lwzu'c "tzcw," zja tohjk hl czxwbm tzsi lq lfwho qpj tzcw. Wjwum ybzmwoc szj tw "lzkkwa" tm ybzmwoc hj lfwho fquw lwoohlqom; lfwcw ybzmwoc zow lfwj, awywjahjk qj lfw zkowwa orbwc, qrl qx lfw kzuw, uwutwoc qx lfw qyyqchlw lwzu, qo "hj vzhb". (Qjw gzohzlhqj qx lfw kzuw hjsbrawc z "vzhb" zowz hj zaahlhqj lq lfw xbzk qj wzsf lwzu'c lwoohlqom.)
Sqjkozlrbzlhqj!
Lfw zjcpwo hc CrtclhlrlhqjShyfwoHcWzcm

換字式暗号や…(ここまで2秒)。

Capture the Flag is a traditional outdoor sport generally played by children, where two teams each have a flag (or other marker) and the objective is to capture the other team's flag, located at the team's 'base,' and bring it safely back to their own base. Enemy players can be 'tagged' by players in their home territory; these players are then, depending on the agreed rules, out of the game, members of the opposite team, or 'in jail'. (One variation of the game includes a 'jail' area in addition to the flag on each team's territory.)  Congratulation! The answer is SubstitutionCipherIsEasy
答え:SubstitutionCipherIsEasy

訳:換字式暗号ってカンタン!


2012年4月27日11時08分54秒に作成されたエントリは?(フォレンジック:100pt)※表題うろ覚え


ファイルが与えられた。

http://sites.google.com/site/horityctf/home/files/Filesystem001.bin

バイナリエディタで開いてみたらjpgとかファイル名っぽいのとかいろいろ書いてある。



ダンプファイルかと思ってmountを試してみたけど「そんなフォーマット知らん」って言われてだめだった。

頻出する「2E 20 20 20 20 20 20 20」とかでググってたら下記のページに行き着いた。

http://pierrelib.pagesperso-orange.fr/filesystems/fat16.html

どうやらFATらしい。それがわかっていろいろやってみたけど、結局mountできなかった。

タイムスタンプがわかればよかったので、上記サイトの"The DOS Date-Time format"の表を参考に「2012年4月27日11時08分54秒」を変換してみた。

年(1980年から数えて) 7bit : (2012-1980) = 32 => 0100000
月 4bit : 4 => 0100
日 5bit : 27 => 11011
時 5bit : 11 => 01011
分 6bit : 8 => 001000
秒(2倍する) 5bit : (54/2)= 27 => 11011

これをつなげて目的のタイムスタンプ「40 9b 59 1b」を得た。
リトルエンディアンにして検索したら1つだけヒットした。



きっとこれ(Panda.jpg)だと思ってsubmitして正解

答え:Panda.jpg

他のチームの解き方を聞くと、stringsして出てきた文字列でブルートフォースしてもよかったみたい(一定時間のロックアウトを恐れなければ)。


パスワードを探せ(バイナリ:100pt)


バイナリファイルが与えられた(実際の出題は拡張子付きのstamp.exe)。


起動すると文字列がいぱーい。


stringsでは見つからなかったので、パスワードを探すべくおもむろにollydbgを起動。

怪しいところを探していたら"TextOutA"なる関数がループで呼ばれていた。



それっぽい文字を1文字ずつ出力していた。引数のY座標は変化しないのに、X座標の方はバラバラだった(さらにもう1つループがあって、そっちはお邪魔文字をスタンプするループだった)。

「Flagを1文字ずつ、順番はバラバラに1行(同じY座標)に表示」って処理かなぁと超閃きをかまして、ループ終了後にブレークを置いて画面を確認した。


おぉ、当たってた。

答え:ST4MPS3CURITY


まとめと感想

解けたのは以上の4問でした。

最初の正解者には1%の追加ポイントが入るので、最終スコアは402。

長野大会に比べたらヒドイですね。長野の2位3位のチームに申し訳ない気がします。

福岡大会の最終的なスコア↓



web系の問題はping打って「ふーん、なるほどね」しただけで全く手が出ませんでした。勉強しときます。

今回はC#の出番はなく、紙とペンが大活躍でした。

優勝するつもりはなかったのですが、優勝した以上は九州代表として全国で「ふーん、なるほどね(pingをうちながら」をかましてきます。

関係者の皆様、おつかれさまでした!