東京工業大学 ロボット技術研究会

東京工業大学の公認サークル「ロボット技術研究会」のブログです。 当サークルの日々の活動の様子を皆さんにお伝えしていきます。たくさんの人に気軽に読んでもらえると嬉しいです。
新歓特設ページ        ロボット技術研究会 HP        ロボット技術研究会 twitter公式アカウント

CTF

「ロボット技術研究会」通称「ロ技研」は、その名前の通りロボットの制作や研究はもとより、電子工作や機械工作、プログラミングなどの幅広い分野にわたるものつくり活動を行っています。

カテゴリ一覧: loading

SECCON 2016 Online CTF writeup

この記事は rogy Advent Calendar 2016 の13日目の記事です。
こんにちは。rogyCTF部のやむどぅ(@ymduu)です。javaの伝道師ではないです。

早いもので、2016年のアドベントカレンダーも折り返し地点ですね。
rogyCTF部は今年もSECCONにSSR_CTF_BU(@shrcyan @ymduu @yosupot @z_kro(ツイッターアカウントは無い))で出ていました。
結果は1000点で83位(国内:20位)でした。

今回は前回のSECCONとは違い、バイナリ大盛りの大会でした(個人の感想です)

以下チーム全体で解いた問題のwriteup 続きを読む

Tokyo Westerns/MMA CTF 2nd 2016 writeup

先日(二週間前)に開催されたTokyo Westerns/MMA CTFにSSR_CTF_BU(ymduu/yosupotの二人)で出ていました。結果は33位でした。

以下解いた問題のwriteup
 

Global Page

webが何もわからないため非常に苦戦した。 page=hogeは自由度が低い(/と.が消される)が、Accept-languagesという欄は自由度が高い。 色々検索したら出てきたphp://filter~みたいなのを実行させたら通った

judgement

フラグを入力して合っているかをチェックしてくれるサービスが与えられる。 入力したフラグをエコーする部分にFSBがある。
起動時にファイルからフラグを読み込んでいるため、スタックの上にフラグ文字列へのアドレスが乗っている。
ので、%28$sでそのフラグを読める。
flag:TWCTF{R3:l1f3_1n_4_pwn_w0rld_fr0m_z3r0}
おたく~

Make a Palindrome!

全探索(next_permutation)

Twin Primes

RSA暗号。
なのだが、二つ用意されているn(n1,n2)が、p*qと(p+2)*(q+2)であるため、p*qとp+qがわかり、pとqを求めることができる。
p,qが分かれば秘密鍵dも計算できるので、cを暗号文として、ans=c^d mod nを計算すれば復号できる。
flag:TWCTF{3102628d7059fa267365f8c37a0e56cf7e0797ef}

Reverse Box

文字列をコマンドライン引数で与えると暗号化して表示してくれるバイナリが与えられる。
バイナリを読むと、randだのtimeだの言ってるサブルーチンでスタックに乱数表を作り、乱数表の先頭から入力文字のasciiコード分だけポインタを進めた場所の乱数を持ってくる、という感じのシーザー暗号的なコードであることがわかる。
が、コードを読まなくても、単一替字式暗号っぽいなあ、ということが分かればバイナリを一切読まずに解ける。
乱数は下1バイトしか使っていないため、乱数表の種類は高々256通りしかないので、1秒に一回暗号化するシェルスクリプトを書けば、与えられた暗号を得られる乱数は簡単に引き当てられる。
フラグが"TWCTF{"で始まっていることを考えると、 TWCTF ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_ を暗号化することを繰り返すシェルスクリプトを書いて、先頭が"95eeaf95ef"になる出力だけ取り出せば替字表が手に入る。
替字表があればdecryptできる。(得た替字表に'-'が入っていなかったため、-だけ復号できなくて困ったが、エスパーで通してしまった)
flag:TWCTF{5UBS717U710N_C1PH3R_W17H_R4ND0M123D_5-B0X}

greeting

greeting tomoriセクションにあるnao関数が特徴的な問題。
セキュキャンCTFにもnao関数がある問題があったらしいですね(僕はその問題を見つけることができなかった)
バイナリを起動すると名前を入れろと言われて、入れるとNice to meet youとか言われる。
脆弱性はNice to meet you部分にjudgement同様FSBがあるが、スタックの上にフラグのアドレスが乗っているということはなく、一回のFSBに使える文字列の長さが64byteであるため、一回のFSBで1ワードしかoverwriteできず、FSBの後にはほぼ何もなく終了してしまう(=GOT overwriteでsystemにすり替えられる関数が無い)。
FSBの後はcanaryのチェックに失敗した場合の__stack_chk_failくらいしかGOT overwriteできそうなものが無いのでEIPを取るのに困る。
fini_arrayを書き換えるとmain関数終了時に書き換えた場所に一回だけ飛ばせるので、それでEIPを取る。 ここで、main関数のstack canaryを積んだ後の部分(-①)にジャンプすると、canaryのチェックを必ず失敗させることができる(もともとcanaryをスタックに積んでいないので、それはそう)ので、そうして、次のFSBで__stack chk_failのGOTを書き換えて①にすれば何度でもFSBができるようになる。
最後にprintfのGOTを書き換えてsystemにすれば、次にprintfが呼ばれる時にこちらが入力した文字列をsystemに渡すことができる。今回はpltにsystemがあるのでそれを使えばOK
方針は一日目の夜には立っていたのだが、DoS攻撃に対する対策の為,出力が131072文字に制限されていたり(この情報は解いた後で出た)、三回目(printfのGOT書き換え)のペイロードが長いとgetnlineでセグフォになったり(意味不明)、つらいバグを踏み続けて時間が無限に溶けた。
手元で動くがサーバーで動かない場合のデバッグのテクが欲しい flag:TWCTF{51mpl3_FSB_r3wr173_4nyw4r3}
コードは以下。コード内でアドレス計算を一切行わないため、echo とかでも解ける(多分)

Super Express

keyは文字列ではなくpairの配列。(s_0, t_0), (s_1, t_1), ..., (s_n, t_n)として c_i+1 = s_i * c_i + t+i という漸化式で暗号化されている。
ただし mod 251 整理すると S * c_0 + T という形になるので、TMCTF{からS, Tの候補を絞れば良い

ESPer

RSAを実行するときに好きな変数の値を乱数で置き換えられる。
まず、乱数を使わなくても2と3をencryptすることでnは得られる decryptは普通にd乗を行うのではなく、mod pとmod qでそれぞれ計算して中国の余剰定理から値を生成していることに注目する。
つまりc^d mod pとc^d mod qを順に計算する ここで、c=1にしてm2を乱数にするとm - 1がpの倍数になるので、2個取得してgcdを得れば大体pが得られる。

Backpacker's cipher - easy mode

asciiなので入力の各文字は7bit目は必ず0であることに注目する。
これにより候補を絞ると、パスワードがかなり絞れる。
確か12文字ということと、更にそのうち何文字かが確定したはず。 この候補を列挙し復元して眺めると、TMCTF, Windowsとかの単語が入っていそうなことがわかる
こんな単語を何個か適当に選んで絞るとすぐに一意になる

rps-ng

初期テーブルは高々6^9通り。 これを全部持って、逐一ありえないものを絞っていく。すると40勝程度ならすぐに達成できる。

whiteout

適当に入力してOEISに突っ込むと[l, r]についてそれぞれ約数の総和を求めてそれのmaxを求めている事がわかる。 あまり大きな素因数を持ちそうになかったので、素因数を1~100の間の素数だけに限定して全探索したら解けた。

Lights out!

Lights Out本家はmod2の行列演算で解ける事が知られているので、今回もそのように考える。 上2行のボタンを押すか決めたら残りは全部一意なので、要するに辺数は2*n。 また、正しいかは下2行が全部白くなるかを見れば良い。要するに条件数は2*n。 後はこれを吐き出せば良い。

glance

見えないgifが与えられたらコマ毎に切り出して繋ぐ。 切り出すのにはgiam、繋ぐのは最強画像処理ライブラリDxLibを使った。

セキュキャン全国に応募しました。(参加します)

追記:選考を通過してセキュリティキャンプ全国大会2016に参加できるらしいです。やったぜ。

どうも。rogyCTF部のやむどぅ(@ymduu)です。
実はつい先日締め切りだったセキュリティキャンプ全国大会2016に応募していました。
セキュキャン界隈にはどうやら応募用紙を晒す風習があるそうなので、僕も晒していこうかなという感じです。
よろしくお願いします。
(CTFではないのですが、一番近いのがCTFなのでカテゴリはCTFにしました)

共通問題はまるまる載せると結構長い上に、他の人の応募用紙を読むときに気になるのはどちらかというと選択問題の回答のような気がするので共通問題はダイジェスト版で。
はよ選択問題読ませろ!って方は続きからどうぞ。

共通問題1

今までの製作物をありったけ自慢してくださいみたいな問題。
僕はグローバル理工兄弟Programmer PANIC!について書きました。
グローバル理工兄弟については初めての言語で初めてのGUIプログラミングをした時の苦労と楽しさ、Programmer PANIC!についてはゲームのコンセプトややりたかった事、工夫点、苦労話など。

共通問題2

今までに技術的に躓いたところとどうやって解決したかと同様の点で躓いている人間にどのようなアドバイスをしますかという問題。

中学生の時、初めてゲームを作ろうとした時に困った関数の返り値と値渡しについて数学の参考書まで出しながら考えた思い出を思い出しながら書きました。

一つのサンプルコードがわからん!って場合でも実は複数の理由が複合していたりするので、まず何が分からないのかをはっきりさせてから文献なりインターネットなり人なりに当たるといいですよという話と、分かったら同じようなパターンをいろいろ試すといいですよという話を書きました。

理解してから色々なパターンを試すと身に着くのが早まるのはマジなのでおすすめです。



共通問題3

(1)セキュキャンで受けたい講義とその理由、(2)セキュキャンで学びたいことややりたいことを述べよという問題。

(1)では、

4-D 実行ファイルの防御機構を突破せよ、

2-A スマートフォン向けゲームのセキュリティ、

1-DDissecting Malware -x86 Windows malware analysis-

の三つを挙げ、それぞれ要約すると

4-D

ゲームに脆弱性があったため任意コード実行されてしまい不正コピーが蔓延り、大きな損害を出す原因となったPSPの話を挙げてゲームを製作する場合でもセキュリティに気をつける必要があるという話

2-A

自分が必死で調整したゲームのパラメータを不正に書き換えられたり、オンラインゲームで不正が蔓延しゲームが詰まらなくなるのはゲーム製作勢として悲しいので作ったゲームを守りたいという話

1-D

一通りx86のアセンブリ言語は読めるようになったが、0ctfで実力不足を思い知り、今の実力ではreversingを社会に役立てることはできないのでもっとreversing力を高めたいという話
をしました。
(2)では、分からなかったことが分かるのは楽しいので分からなかった事をたくさん知りたい、だとかバイナリが好き、だとかSECCON本戦に行く時にメンバーが足りないくらい周りにセキュリティに興味のある人間が居ないのでセキュリティ友達がほしい、だとかその辺のことを書きました。


今要約しながら見直すとゲーム色が強い回答になっている気がしますネ
選択問題は応募用紙から丸々コピーしたものを載せます。割と長いので続きからどうぞ。

続きを読む

場阿忍愚CTF writeup

rogyCTF部のymduuです。
昨年11月半ばから開催されていた場阿忍愚CTFにymduuとして出ていました。
結果は40位でした。
大分前に解いた問題が多いので忘れていることも多いのですがwrite upを書いていきます。
続きを読む

SECCON 2015 予選 Writeup

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に投げられれば総当りでも間に合うんじゃないか、と思うも技術力が足りず断念。二日目起きてからずっとこれと格闘していたのに解けずとてもつらかった。
ギャラリー
  • 自作キーボードを作ろうver1.0
  • 自作キーボードを作ろうver1.0
  • 自作キーボードを作ろうver1.0
  • 自作キーボードを作ろうver1.0
  • 第14回ROBO-ONE Light 結果報告
  • ロボット技術研究会紹介
  • ロボット技術研究会紹介
  • rogy2016冬合宿 in 戸狩
  • rogyサバゲ:†革命†をもっと
記事検索
最新コメント