CTF班・第17回の活動をしました

2年部員の井上 (@sei0o)です。今日もCTF班の活動をしました。

中間試験明け初めての回です。CLCのRoom Aを借りてみました。予想したとおりホワイトボードがちゃんと消せるようになっていてやりやすかったです。2年生4人と1年生3人なので、いつもより多いですね。

活動ではTendollar CTF 2018で出題されたSandbox School 1というpwn/exploit問題を解く、ということをしました。

Sandbox School 1は受け取ったバイナリ文字列をバッファに流して実行するだけというシンプルな問題なのですが、C言語のコードを解説してx86-64のシェルコードを紐解いていくのは久し振りだったので個人的には結構疲れました。


この問題ではバイナリのソースコードが与えられているので、それを読みます。
プログラミングの授業が10月から始まったはずの一年生はまだfor文を習ったばかりだそうです。そんなもんだっけ。


pwn問題ではexecveシステムコールを呼び出すことがゴールになることが多いので、シェルコードを使う前にまずはC言語から呼び出して動作を確認。


シェルコードはただのアセンブラですが、短くするために様々な工夫がなされています。そういうのを見ていったら面白いんじゃないかなーと思って話してみたのですが、難しかったようです。

久しぶりにやってみて、やはり自分は説明が下手だと自覚しました。あんまりこういう状態が続くとみんながCTFを嫌いになってしまうので、なんとか自分が説明しなくていいような方法を考えているところです。

CTFのほうのスキルも一年前と大差ないということを思い出して、なんだか悲しくなりました。おまけに寮のクリスマス会にも行けず、胃も心も寒い夜でした(ポエム風)。

CTF班・第16回の活動をしました

2年部員の井上 (@sei0o)です。中間試験前最後の活動をしました。前回のCommon Modulus Attackの続きです。拡張ユークリッドの互除法の証明について文書を読みながら一緒に考えてみたのですが、よくわかりませんでした。

??????????????????????

とりあえずユークリッドの互除法を「逆にたどる」の意味はわかったのですが…はてさて。
テストも頑張りましょうー。

CTF班・第15回の活動をしました

2年部員の井上 (@sei0o)です。この前の代表者会議(←すごそう)でweb班が復活して、そこの班長になってしまいました。詳細は控えますが、外部から委託を受けてうんぬん…らしいです。
記事を書こうとブログを確認するとコメントが来ていました。「おー、ついに来たか」と思って見てみたらスパムでした。残念

Square CTF 2018に出たので、そこから問題を一つ選んで解説することにしました(班のSlackでも誘ったけど結局解いたの自分だけだった→write-up)。
流れで2問目のRSA暗号に対するCommon Modulus Attackをする問題をやることになりました。
Common Modulus Attackについてはここを参照してください。

「ん〜これうまく説明できるかな?」と内心思いながら話していたら案の定拡張ユークリッドの互助法あたりでわからなくなってあわわわ…
正直普段の生活で使わないのですぐ忘れちゃうんだなあ。というわけで互助法の話は次回(テスト前最終回!)に回すことにしました。
そういえば毎回毎回人が変わるので1つの話題を1回で収めようとしていたのですが、最近やっと固定化されてきたのでこういう「ではまた次回」的なことが言えるようになったんですよね。


↑2Fのコミュニティスペースのホワイトボードが汚い。汚すぎる。
もともと書いてあった「大園桃子」って誰なんでしょうか。周防桃子のSSR衣装良いよね



↑合同式上での演算。この辺から自信がなくなってくる。二項定理は忘れた。

↑だいたいこんな感じ 暗号ってすごいね〜

まあでもこうやって続いてるのはいいことですよねー。

CTF班・第14回の活動をしました

2年部員の井上 (@sei0o)です。昨日Macに入れているディストリビューションをopenSUSEからArchに変えました。ついさっき日本語入力ができるように(一応)なったので、ブログも日本語で書けます。

久しぶりだったので適当に近況を共有したあと、「プログラミングの先生がEmacsをやたら推してくる」という理由でEmacsのソースリーディングっぽいことをしました。2年生2人と1年生2人。

とりあえず起動してすぐ実行されるmain関数の冒頭を読み解いていきました。具体的にいうとコマンドライン引数のパース部分です。1年生はまだプログラミングの授業が始まったばかりなので、ポインタや文字列操作系の関数は随時説明しました。メモリ上の配置は前回前々回と見ていたのでサクッと説明したわりにはわかってもらえたんじゃないかなあ。

扱ったEmacsのバージョンは2.61です。GNUからダウンロードできます。main関数が入っているのはsrc/emacs.cです。

int main(int argc, char **argv) {
  ...

  sort_args(argc, argv);
  argc = 0;
  while (argv[argc])
    argc++;

  // コマンドライン引数に -version, --version が含まれているかチェック
  if (argmatch(argv, argc, "-version", "--version", 3, NULL, &skip_args)) {
    const char *version, *copyright;
    ...
    printf("%s %s\n", PACKAGE_NAME, version);
  
  ...

もうちょっと上のほうにさかのぼってみるとargmatch関数の実装があります。skipptrの次の引数をsstr,lstrと比較して, 値を指定するオプション(–chdir)であれば値となる文字列のアドレスをvalptrに入れています。下のほうにある三項演算子がif-else文と同じ意味を持つと解説したところ、すごく読みづらそうにしていました。その気持ちわかるなあ。

static bool argmatch(char **argv, int argc, const char *sstr, const char *lstr,
                     int minlen, char **valptr, int *skipptr) {
  char *p = NULL;
  ptrdiff_t arglen;
  char *arg;

  // argv[argc]のようなアクセスが起こらないようにする
  if (argc <= *skipptr + 1)
    return 0;

  arg = argv[*skipptr + 1];
  if (arg == NULL)
    return 0;
  if (strcmp(arg, sstr) == 0) {
    if (valptr != NULL) {
      *valptr = argv[*skipptr + 2];
      *skipptr += 2;
    } else
      *skipptr += 1;
    return 1;
  }
  arglen = (valptr != NULL && (p = strchr(arg, '=')) != NULL ? p - arg
                                                             : strlen(arg));

ポインタをふんだんに使ったソースコードを眺めながら「このわからなさが楽しい」というようなことを@pittyi2ndが言っていて、「あーそうだよな、そういう感覚忘れてたよなあ」と思わされました。かといって難しすぎるとやる気失くすんだけど。

Slackでも随時クイズ形式でソースコードを投げてみようかなあ。次回はちゃんとCTFしたいですね。CTF班じゃなくて低レイヤ班でもすればよかったか。

CTF班・第13.5回の活動をしました

空白の美

1年部員の東 (@pittyi2nd)です。投稿が少し遅れましたが、CTF班第13.5回の活動を記録しておきます。今回は次期部長の井上先輩 (@sei0o)が忙しい~\(>_<)/ってことで、次期CTF班 班長のイッシー君と二人で夜を過ごし高専セキュコン(2018)に出てきたQRコードの問題を解きました。

いつものように16:30から始まると思ってコミュニティスペースで待っていたのに誰も来なかったので寝ました(スポーツ大会が長引いた模様)。寝ていたら王子様w(イッシー)がやってきてキスをして起こしてくれましたとさ。

CTFに出てくるQRコードの問題で、右側が分かっている場合は簡単です。この記事に書いてある通りに読んであげると終わりです。でも、わからんわからん〜!!💥単純作業って難しい(><)ってなりませんか?
そんなあなたにstrong-qr-decoder。QRコードをテキストに変換してあげるだけで簡単にQRコードが読めるようになります(なおイッシーはこのテキストに変換する部分を間違って出来ないできないしていた模様)!!

今回CTF班の講義(笑)をやってみて–1回活動の時間を上手に使うのは難しいなと思いました。毎回違う話をするのもすごいと思いました。(「思いました」を続けるな)

CTF班・第13回の活動をしました

2年部員の井上 (@sei0o)です。投稿が少し遅れましたが、CTF班第13回の活動を記録しておきます。1年生2人、2年生5人。

今日はいつもと違う場所で違うことをしてみました。上の画像の通り黒板ということは…2Eの教室です。ここ数回使っていたコミュニティスペースは合唱部に占領されていました。コンピュータとゲームと受験勉強しかしてこなかったのでああいう活動の楽しさがよくわかりません。いやコンピュータの楽しさもよくわかってないけれど。

CTF班ですが毛色を変えて、Hacktoberfestにみんなで参加してみました。これはDigitalOceanが主催しているキャンペーンで、10月中にGitHubでPull Requestを5回送ると先着50000名にTシャツが与えられるというものです。マージされなくてもよいというのがミソ。HackとOctoberの造語ですね。

簡単ではありますが、英語のUIとgitに慣れてもらうのにちょうどいいかなと思って選びました。部活の時間中に1個送って、残りはまったりと各自でやってもらうつもりだったのですが、1時間半で5個送る強者がチラホラ。内訳を見てみると有志が用意しているPull Request練習用のリポジトリに大量に送っていました。なるほどなー。あまりに無意味なスパムっぽいPull RequestはHacktoberfestでカウントされないだけなので、そのことを伝えPRを送りやすそうなリポジトリを紹介してみたところ、マトモな(?)PRを送るようになってよかったです。

あまりPRを送ったことがなかったので自分にとってもいい機会になりました。GitHubが草で埋まっているとカッコいいですよねー。イチから何かを作るのは考えることが多くて飽きてしまって続かないなあ。しかし最近はソースコードを読んで改造する機会が多いので、GitHub上のリポジトリでもそういうアプローチでcontributionを増やして能力向上に役立てられるんじゃないかと考えています(自分語り)。

10/27, 28の全国高専プログラミングコンテストが着実に近づいて来ていて、そちらとのバランスを取るのが難しい…まあ気合でどうにかこうにかなるでしょう。高専祭のほうは何も考えていません。

CTF班・第12回の活動をしました

2年部員の井上 (@sei0o)です。カナダから帰ってきてから生活リズムが元に戻らずつらい思いをする毎日です。これの原因は情研で喋り疲れたからということにしておきましょう。
今日もバイナリについて話しました。CyberRebeatCTFの続きをしようと思いましたが、回線が悪くて問題ファイルがダウンロードできなかった()ので、オフラインでできることをしてみました。具体的には、

  • 脆弱なCプログラムを書いてバッファオーバーフロー脆弱性、SSP(Canary)のありがたみを実感する
  • メモリマップを見つつASLRを無効にするなどして遊ぶ

デバッガ(gdb)にもだんだん慣れてきたんじゃないかなと思います。とりあえず私が一番慣れているPEDAを押し付けていますが、GEFといった他のgdb拡張や、lldbなどの他のデバッガのほうが合っている人もいるかもしれません(iOSアプリ開発で使うXcodeだとデフォルトはlldbだったような)。

完全に個人の趣味でMIPSとx86のアセンブラを見比べました。遅延スロットがチャームポイントだと思います。

次回はどうしようかな〜。やっぱり人に教えると自分のほうにもやる気が出ていいですね。

CTF班・第11回の活動をしました

2年部員の井上(@sei0o)です。夏休みが終わり後期が始まって1回目の活動です。累積ではたぶん11回目です。たぶん。
全く何も考えていなかったので、さあどうしようという感じでした。とりあえず行ってみて夏休み何した〜?と聞いてみると、CyberRebeatCTFに出た部員(ぴっちー)がいたので、その問題(SimpleBinaryというファイルを扱うreversing問)を解説しつつ、「binutilsの愉快な仲間たち」を紹介しました。2年生2人と1年生3人。

  • 実行可能形式のフォーマット(ELF, PEなどがあるんだよ〜みたいな, あとreadelf)
  • 動的リンク・静的リンク
  • x86アセンブラとスタックの関係(関数プロローグ・エピローグの話もしたかった)
  • gdb(+PEDA)を使った動的解析の体験

こんな感じです。

ELF, ローダについてはちょうどハッカソンで個人的に学習していた部分なので楽しく話すことができました。
ASLRとかPLT, GOTについても話したくなったけれど、きりがないのでまた今度にします。

ところで、これまでとホワイトボードが違うことにお気づきでしょうか。それまでは「情報メディアセンター」の演習室で活動していたのですが、なんとなく雰囲気が入りづらいよね〜という話になったので今日は3Fのコミュニティスペースを使ってみました。何も言われなかったので多分大丈夫でしょう。椅子の構造とホワイトボードの消しづらさに少し不満がありますが、まあ割とゆるくできたんじゃないかなと思っています。

大雨で延期になった新入生歓迎会は高専祭の打ち上げと同時に行うそうです。部長曰く、そこで私が部長の座を押し付けられる譲られるそうです。わーい。
高専祭何しようかな…。

CTF班・第8回の活動をしました

2年部員の井上 (sei0o)です。こいつはTwitterアカウントを書かないと気がすまんのか。今日も元気にCTF班!
今回は画像フォレンジックの問題を扱いました。資料はWikiに置いてあります。file, xxdコマンドでざっくりファイルの情報を確認した後、stegsolveを使って解析。その後スクリプトを書いてみる…までできればよかったのですが、そういえばプログラミングの講習をほとんどしていないのに無茶だと考え、仕組みを解説するに留めました。
フォレンジックは見た目的にもわかりやすく、割と興味を持ってもらえたようで嬉しいです。来週の火曜日はminiCTF2の解説をする予定ですが、全完されたら困るなあ(困らないけど)。作問も難しいですね〜
今日は割と資料にすべて書いて、余計なことを口走って混乱させないようにしつつ軽い解説とサポートを中心にしていました。そのためホワイトボードに書くこともほぼなくなりアイキャッチの画像が設定できません!w
まだLinuxに慣れていないのか、ツールの導入で詰まりやすいとわかったためこうしました。それでも「No such file or directory」ぐらいなら読んでほしいなと思います。
次は資料もプログラムも遅筆なのをなんとか改善したいと思いいろいろ調べているところです。1時間ぐらいでかければ文句ありませんが、現状では3時間以上食ってます…

CTF班・第7回の活動をしました

2年部員の井上 (sei0o)です。上の画面で中学生10人は釣れると思います。ちなみに今日はCTF班バーチャル回でした。

バーチャル回?

おっと(←わざとらしい)、バーチャル回の説明をしていませんでしたね。端的にいうとDiscordなりLINEなりで通話しながら部活しようぜというものです。遠隔で行うことで以下のような問題が解決されてほしいなあという期待。

  • 他の部活と曜日が重なって来れない人が結構いる(ロボ研などとは違って求心力のない部活なので部員は他を優先する傾向にある)
    • →バーチャル回は夜20:00からにしました
  • 情報センターはCTF班以外の人が多くてやりづらい・横並びに座るのでみんなの進捗が見えづらい
    • →顔が見えないのでやりやすい
  • 講義役が立ってホワイトボードに書き込む必要があるのでしんどい
  • そもそも前期で9回しか部活できない
    • →バーチャルやって週2にできる

感触はそれなりに良好で、話す側としても圧倒的に気がラクでした。実際に行って初めて気づいたメリットとして、音声通話だと相手は相槌を声で発する必要があり、より明確になることが挙げられます。うなずく動作だけだと曖昧にしか捉えられずこちらの言うことが伝わっているのか不安でした。
実は第4回第5回の講義は通常の火曜日の活動に加え、水曜日20:00から同じ内容を私の寮部屋で行っていました。男子寮生は寮部屋で、そうでない人は通話で参加です。
ただ同じ内容を2回話すとおそらく私が飽きてしまうので、今週から内容は変えることにしました。回も分けて第6回(通常回=オフライン回=オフ回)・第7回(バーチャル回)としています。

第7回の内容

angstromCTF 2018で出題された「Rev1」という問題を題材に、x86アセンブラ, デバッガの紹介をしました。とりあえず動かしてもらって、表示された文字列がどこからやってきたのか逆アセンブラ(objdump)やデバッガ(gdbでx/sとか)を駆使して探してみてもらいました。資料はWikiに置いています。
完成していない資料をその場で作りながらわりとざっくりした解説しか行っていないのですが理解できたみたいでよかったです。