部長の井上 (@sei0o)です。以前の記事で結局消しとばしたセキュリティ班の記事を復活させていなかったのでこの記事で一気に振り返ってしまいます。CTF班のWikiページ、Scrapboxも参照してください。別にしなくてもいいです。
第1,2回: CTFの紹介 + バイナリを読む
↑ZIPファイルのシグネチャ(50 4b 03 04)を解説しているシーン
資料。当時はおもしろいからいいでしょと思って資料書いてたけど見返すと結構攻めてますね。Linuxの紹介ここでもしてるなあ。SECCON Beginners CTFはBeginners対象じゃなかった。
第3回: USBの通信を覗く
↑このときはまだopenSUSEを使っていて、KDEをダークテーマにしていたのでWireshark(Qt)もダークになってます
資料。WiresharkでUSBキーボードとホストの通信が入ったpcapを読んでいます。picoCTF 2017で出題されたものです。
第4回: 5000兆円XSS
資料。時事ネタに乗っかった回。JavaScriptというかWeb系はやっぱり見た目が華やかなのでウケました(当社比)。コンソールに打って一発だもんなー。確かこの辺からバーチャル回を導入し始めたと思います。ロボ研の後輩が「情研行きたいけどロボ研週5だから行けない」というので部活のない夜に寮の自室で軽く講義をしていました。同じ内容でも話す側としていろいろ変えてみるのが楽しかったです。
↑このあたりからホワイトボードを使い始めました。粗悪な講義でも自分のしたことは写真にとって残しておきたいという自己愛精神の現れ。
第5回: 既知平文攻撃
↑「そもそも暗号ってなんだ」ってところから公開鍵暗号, RSA…みたいな感じで予期しない(気づいていなかった)事前知識を話して毎回時間ギリギリになっていました。
資料。pkcrackを使ってzipファイルに対する既知平文攻撃を試してみます。前回のNITAC miniCTFの問題を引用しています。暗号も魅力的ですよね。
論文も短いから頑張って自分で理解してみようとして途中までまとめていました。CRC32はガウスか誰かの理論が応用されているとどこかで聞きましたが、それも調べようとして放ったらかしになっていますね…。
第6回: apk解析
↑アプリ内のSQLiteデータベースから情報を抜き出している(?)ところ
資料。身近なところでのテーマを取り扱ってみようと思い、Androidのアプリ解析をしてみることに。BSideSF CTF 2017の問題を使っています。前回の反省を活かして問題を解き切るところまで行かずに途中までを解説しています。そもそも.apkも.appもただのzipファイルというのを知るだけでも楽しいよなー。
自分は日常的に使っているので忘れていましたが、WindowsユーザがLinuxのコマンドラインによる操作に慣れるのは時間がかかるようでエラーメッセージを読んで適切に対処するのも難しいようでした。そもそもアイコンがないのでエラーが出ているということにすら気づきづらいのかもしれません。例えばC言語のコンパイラであればgccよりもエラーメッセージがカラフルで親切なclangを使うなどの工夫ができそうです(最近はgccも親切にはなっていますが)。
あとはエラーメッセージが英語なのもハードルを上げている一因です。いずれ英語のフォーラムやメッセージを読むことには慣れる必要があると個人的には思っています。しかし自分の例を振り返ってみれば、むしろ技術背景の知識(=文脈)を手がかりに英単語の意味を推測して読んでいました。「ああセミコロンが抜けていたからこの”syntax error”というのは文法に関するエラーなんだろう(メモリリークではsyntax errorにはならないのだろう)」という感じです。それが逆転し英語の文章を読んで技術知識を拾ってくるようになったのはいつからかわかりません。そういうアプローチが他の人に適用できるのであれば、まず土台となる知識は日本語で提供して良いということになります。まあ高専生はすでに英語教育を中学で受けているのでそんな変なアプローチをとることはないですし、それよりも高専生が持ちがちな英語への苦手意識をプログラミングへの苦手意識へと転化させることなく英語(を読むこと)に慣れてもらうことが大切なのかなと思います。自分でも何書いてるかわからなくなってきました。
↑「バイナリをやりたい」という人がいたのでアセンブラとかそれを包んでいるELF, PEについてちょっと話していました。あくまで「ちょっと」です。
第7回: バイナリ解析
↑radare2はセキュリティ班のオシャレアイテムです。部活動紹介でも展示してたら人が寄ってきました。
資料。angstromCTF 2018の問題を使ってリバースエンジニアリングっぽいことをしてみます。血が騒ぎますね。__libc_start_mainの話もしてみようかと思いましたが時間が足りないので断念。そもそも1年生この段階でプログラミングの授業始まってないんですよね。
第8回: 画像フォレンジック
↑右の方にFLAGが出ていますね
資料。いわゆるstego問です。案外受けました。やっぱり見た目がそれっぽいって正義ですね。LSB(Least Significant Bits), Exifとかそのあたりの解説もしました。
第9回: NITAC miniCTF2解説
↑個人サイトで遊べます。解説もあるのでやってみてね
資料。NITAC miniCTF 2の解説回。ネタ切れに苦しみ始めた頃です。運営大変だったけど終わってから焼き肉をおごってもらえたのを思い出します。
第10回: SAT/SMTソルバ
資料。主にrevやcryptoの問題を解くときの手段としてときどき使うSAT/SMTソルバを使ってみました。具体的にはz3で数独を解きます。ただ思った以上に説明が難しくて時間(16:00-18:30)に収まりませんでした。
なぜか第10回は画像が残っていません。
第11回: バイナリ解析2
↑「第12回(たぶん)」実際間違えていた
CyberRebeatCTFに後輩が参加していて、それの解説をしてほしいと頼まれたので解きつつ話しました。いや頼まれてないかもしれない(過去は都合よく美化されるものです)。gdbやobjdumpさえあれば簡単に解ける問題だったのでどちらかといえば使い方の説明が中心になったかな。
これまでは図書館にある演習室で大きなホワイトボードを使って活動していましたが、今回からは一般科棟のコミュニティスペースを占領して使っています。演習室は教室にパソコンを付け足したような構造になっていて、ホワイトボードを使うと聞いている人の距離が遠くなったり個々の作業の進捗を背後から観察しづらいので変えてみました。マーカーのインクが少ないこと以外は割といい感じだったので使えるときは使っていました。ここからセキュリティ班の遊牧生活が始まります。
↑この人またlibcの話してる…
第12回: アーキテクチャ
CyberRebeatCTFと書いてありますが…これ本当に問題解説?MIPSとx86のバイナリを渡して固定長命令と可変長命令のメリットデメリットを考えてみたり、SSPとASLRについてざっくり話してみたりしました。スタックの話もすでに数回していたような。このあたりから個人の用事が忙しくなってきて資料を作らなくなります(言い訳)。
↑C言語で脆弱なプログラムを書いてみるの図。getsはもうダメ関数の代名詞ですよね(?)
第13回: git, GitHub
↑ここはどこでしょう
遊牧民族セキュリティ班が次に向かったのは2EのHR教室です。数研も使ってるしいいよね。Hacktoberfestが開催されていたのでgit, GitHubを講義するついでにプルリクをお試しで送ってみました。Hacktoberfestでは5回プルリクを送ればTシャツがもらえます。私の他に後輩が一人ゲットしていました。
ただ手順の説明に偏ってしまって、プルリクの意義を理解しないまま・Contributionの英語を読まないまま送っている人がいて説明不足だったことに気づきました。これだけ簡単に、普段エディタで編集するような形でコミットできるようになるとやはり他人のリポジトリを書き換えているという感覚が薄くなるのかもしれません。
第14回: ?
記録がない。もしくは番号を間違えている。
第15回・第16回: RSA暗号
↑「CTF及びセキュリティに関する班」って何?法案?
Square CTF 2018の問題を、write-upを見つつ解説しました。ただCommon Modulus Attackで使う拡張ユークリッド互除法が実はよくわかっていなくて、うまくごまかせずに(?)白板を前に唸っていました。途中からみんなで唸ってその次の回も唸りましたがよくわからないまま終わってしまいました。
↑群論の話を持ち出しそうになったがギリギリ耐えた。
↑あーもうむちゃくちゃだよ(みんなでホワイトボードに書いてる)。でも共同作業という意味では一番部活動らしかったかも。
第17回: pwn
↑ホワイトボードが大きい
CLC(協同学習センター)の部屋を借りてみました。壁全面がホワイトボードで便利。
また別のCTFの過去問を引っ張り出してきて解説しました。pwnの入門によくあるreadしたバイト列をなぜかexecutableな領域に保存して実行してくれちゃうアレです。見慣れないC言語の関数もあるので適宜manを参照してもらいました。
↑とはいえmanを読むだけではイマイチつかめないこともあるので、実際に簡単なのを書いて動かしてみるのもいいことだと思っています
↑時間が余ったのでシェルコードのアセンブラを解説してみようとしたが「cdq命令って何だっけ?」といった感じでいろいろ詰まってしまって時間切れ
第18回: ret2libc
↑スタック殴り書き
資料をまた書き始めました。スタックと簡単なアセンブラの復習をした後でBOF脆弱性を使ってret2libcで攻撃をしてみました。こうやって書くとかなり詰め込んでますね…
第19回: popret gadget
資料。第20回となっていますが間違いですね。でも気にしません。pwnネタ以外を探そうとしても新しい何かを開拓する元気がなかったので…。
第20回: Netlify
現会計は茶道部の部長も兼任しています。茶道部のホームページを作って公開したいということで、NetlifyでGitHubからコンテンツを公開しつつドメインを割り当ててみました。それを題材にDNS, HTTPの仕組みも解説してみました。Hacktoberfestでgitの使い方も大丈夫です。
第21回: SQL
最後は競技SQL部で遊んで活動を締めくくりました。SQLでFizzBuzzって頭おかしいですよね(褒め言葉)。
まとめ
とりあえず週一回だし広く浅くコンピュータで遊んでもらおうと考えた結果、なかなか凄惨なカリキュラムになったと思います。加えて自分ではがんばったつもりですが説明はお世辞にもよいものとは言えませんでした(話しているときの反応を見ればそういうことはわかる)。それでも少しでもセキュリティもしくはコンピュータに興味を持ってもらえたら嬉しいです。2019年度は他の班も活発になりそうなので、他の人の説明などを聞きつつ勉強しようと思います。