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班じゃなくて低レイヤ班でもすればよかったか。