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

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

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

カテゴリ一覧: loading

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を使った。

第4回ゲーム製作者交流会GAME^3を開催しました

こんにちは。15のアークです。

9/3(土)に第4回GAME^3を開催しました!
場所は東工大大岡山キャンパスS223講義室で行いました。
GAME^3(ゲームキューブと読みます)とは、「ゲーム展示と製作者同士の交流」を目的としたゲーム製作者交流会です。
G^3_4thillust_color


来場者数はおよそ50名ほど、展示ゲームブース数は19ブースでした!
ゲームを展示したり、ゲームを遊んだり、ゲーム制作について議論をしたりと盛り上がりました。
この機会にゲーム製作者どうしの交流の輪が広まってくれたらいいなと思います。
ゲーム展示者の方々や当日遊びに来られた方々には本当に感謝しています。ありがとうございました。

(ここに当日の様子の写真を載せたいところなのですが、写真を取るのを忘れてしまいました。ごめんなさい。)

当日のアンケートによる人気ゲームの投票結果は次のようになりました。
第1位 ミツボシクリエイターズ ミツゴロウさんの『AI Paint』
第2位 ノンリニアさんの『ぎみっくぷらいむ!』
第3位
東京工業大学ゲーム制作サークルtraP ninjaさんの『Block Filling』

アンケートでは、「楽しかった」「またGAME^3を開催して欲しい」という声もあり、第5回GAME^3も開催できたらいいなと思います。次回も是非ご参加下さい。



質問等がございましたら、こちら(gamemakers.conference.game3@gmail.com )までご連絡ください。
GAME^3公式wikiはこちら
GAME^3公式Twitterアカウント @GAME3_Staff
第1回の記事はこちら
第2回の記事はこちら
第3回の記事はこちら

MATLABでグラフエディタ作ってみた(完成版)

みなさんこんにちは,マハトです.

本日,7月ごろに作り始めたMATLAB グラフエディタがついに完成しました!
前回の記事で紹介したものとは大きく変わり,より使いやすく機能も充実させたので,
それらを紹介したい&ソースコードの公開をしたいと思います.

まず,「graph_editor(ノードの数)」 によって起動してみます.今回はノードの数は6個にしました.

起動

6個のノードが円周状に並んでいます.
次にエッジを作ってみましょう.作り方は,始点→終点の順にノードをクリックするだけ.試しに1→2の順にノードをクリックすると……

エッジ1

1→2のエッジが作られました.このとき逆に2→1のエッジを作ってみると,

エッジ2

このように,双方向のエッジに変わります.
こんな感じで好きなノード間にエッジを生成し,グラフを書いていきます.

また, ノードやエッジを右クリックするとメニューが表示されるようになっています.

右クリック


 このメニューを使用することで,ノードやエッジの色や大きさ,太さ等を自由に編集することができます.
試しに色々編集してみたのがこちら↓ 

設定変更

また,各エッジには重みを設定することもできます.メニューバーから「Weigh on」を選択すると……

重み

重みが表示されます.これも重みの数値やフォントサイズ,位置などを自由に設定できます.

他にも,生成したグラフのグラフラプラシアンや隣接行列等を求めることもできます.メニューバーのDisplayからGraph Laplacianを選択してみます.

グラフラプラシアン

コマンドウィンドウに上のグラフのグラフラプラシアンがMATLAB形式で表示されました.正しい値が出力されていると思います.
※グラフラプラシアンや隣接行列の定義は転置されているものとされていないものがありますが,今回は僕がマルチエージェント制御でよく使う方の定義を使用しています.ご了承ください.


ちなみに,作ったグラフはもちろん画像ファイルとして保存できます.今回はfig,png,jpg,eps,svg形式で保存できるようにしてみました.また,figで保存しておくと,メニューバーのFile→Openでそのfigを開くことで再編集することができます.

他にも機能はありますが,紹介しきれないので詳細はフォルダに入っているreadmeをご覧ください.


以上でグラフエディタの紹介は終わりにしようと思います.今回はパズドラとは違ってコードも結構キレイに(あくまで相対的にですが)書いたつもりなので,ソースコードを公開しようと思います.
URLはこちら(Googleドライブです)↓
https://drive.google.com/open?id=0B5hAfc2dCPemQWZFSUp2M1VBVTQ

バグ等が見つかりましたら,この記事のコメント,もしくはreadmeに書いてある連絡先までよろしくお願いします.


ということで,今回の記事は以上になります.
工大祭ではさすがにグラフエディタを展示するのも何なので,MAT&ドLABンズを改造して展示しようかなと思っています.
何も手を付けてないけど,あと1か月あるし何とかなるよね……


おまけ:MATLABで作ったグラフエディタでMATLAB作ってみた
matlabグラフ

 
ギャラリー
  • 第4回ゲーム製作者交流会GAME^3を開催しました
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
  • MATLABでグラフエディタ作ってみた(完成版)
記事検索
最新コメント