技術めいた何か

1人の学生によるIT系の記事群

SECCON Beginners CTF 2020 Writeup(Crypto: R&B, RSA Calc)

2020/05/23 〜 2020/05/24に開催されたSECCON Beginners CTF 2020にTeam: r0bu5tのCrypto問担当(?)として参加しました。prprhytです。 せっかくのアウトプットする機会なので、手をつけた分は復習も兼ねてWriteupを書きます。

僕自身は解いたのは2問だったのですが、チームメンバーのおかげで順位は44thでした。 反省点も多いので貢献できるように精進します。。 f:id:atofaer:20200524153614p:plain

Writeup

crypto: R&B

与えられたもの

与えられなかったもの

  • FORMAT(後述)

符号化されたFlagと符号化を行った際に使われたらしいソースコードが渡されます。 ソースコードを読むと FORMATという文字列に従って、rot13とBase64で符号化するようでした。 例えばFORMAT='BRBB'の時はBase64->rot13->Base64->Base64と符号化するプログラムのようでした。 厳密には符号化したあとにBase64で符号化した場合はB、rot13で符号化したときにはRが符号化後のFLAGの先頭に足されるので、符号化されたFLAGの先頭から順にBかRかを見て対応するデコーダーで復号すればflagを得られました。 最初はちゃんとソースコードを読んでいなくてもっと複雑なことが必要かと思ってたので時間をかけてしまいました。反省。

crypto: RSA Calc

サーバーがカンマ区切りの逆ポーランド記法+αなフォーマットを受け取り、計算式への電子署名を検証をパスするかつ、計算結果が1337のときにフラグが出力される問題です。 逆ポーランド記法の+ αの部分はシンボルFです。シンボルFが入力されるとその時点でのstackから値を一つ取り出して1337であるかチェックします。チェックが通ったらFlagが出力されるというものでした。

また、サーバー側のプログラムは計算式への署名機能と計算式の実行機能を持っていました。

署名機能:
入力: data: カンマ区切りの逆ポーランド記法+αの形式で計算式を渡す
出力: signature(署名)が出力される
制限: 署名のdataにF、または1337が含まれていると署名をしてくれない

計算式の実行機能:
入力: data(計算式), signature
出力: 計算結果, Fが入力され時点での計算結果が1337のときにflagを出力
制限: signatureの検証に失敗するとエラー

解法の方針としてはFlagを取れるような計算式への署名をサーバーの署名機能で打つことはできないので、署名を偽造する方針を取りました。

サーバーに実装されていた署名の式は sig = md mod Nで、mが合成数でm1, m2に因数分解可能なとき、
sig1 = m1d mod N
sig2 = m2d mod N
とすると、
sig == sig1*sig2 mod N
を満たします。
また、サーバー側は受け取った数式をbytes_to_long()でlong型へ変換してから署名を打っていました。 よって、目標の式を1337,Fとしたときにbytes_to_long(b'1337,F')==m1 * m2を満たすm1, m2をサーバーに与えて署名を打ち、 あとは前述の通り、得たsig1,sig2から1337,Fに対応する電子署名をローカルで作成してサーバーの計算機能に式1337,Fと一緒に署名を入力するとFlagを得ることができました。

余談1: 当初はサーバーへのバイナリの送信はecho -e '\x01' | pbcopy をしてncコマンドの入力に貼り付けて送信していたのですが、うまく送信できなかったので、最終的にはGoでsocketクライアントを書いてサーバーとやり取りをしていました。

余談2: 最初はdが小さいと仮定してDLP解けばいいよね...とBSGSアルゴリズムをまわしましたが、dは十分に大きいようで時間がかかりうまく行かなかったため、上記の方針に切り替えました。 あと、色々な検証を@souring001君と進められたので一人でやるよりとても気が楽でした。感謝...!

チームメイトに解いてもらった or 手をつけたけど解けなかった問題

crypto: Noisy equations

詰まっていたら、@souring001君が解いてくれました。感謝...! 連立方程式を解く方針で解けるそうです。

追記2020/05/24 10:30: 参照: qiita.com

crypto: Encrypter

暗号文のサイズの変化具合からブロック暗号っぽいとは思って色々こねくり回し、ラスト30分くらいでCBCモードぽいことに気づきました。が、時間切れでした... 大会終了後にTwitterで他の人のつぶやきを調べたところ、CBC Padding Oracleで解けるようです。 確かに不正な暗号文を投げるとエラーが出ていましたが、Paddingチェックエラー由来だということに気づけませんでした...(終

感想

反省点としては、解くに前半は一つの問題に集中して取り組めなかったことです... 解けなそうと思ってすぐに手放して他の問題をやってしまうことがありました。 適宜休憩とったほうが良いなという反省もあります。 とりあえず、チームメンバーには感謝です🙇 大きく実力不足を感じたので、今後も精進していくぞ..!

21新卒セキュリティエンジニアの就活をした

  • 誰?
    • 情報系大学院生(M1、21卒)
    • (情報工学成分が多めの)暗号理論の研究をしている

21新卒でセキュリティエンジニアの就活をしました。
就活の詳細は割愛しますが、報告も兼ねてオフライン/オンラインで聞かれた質問一覧を載せます。

Q.どこにいくの?
A.ここには書けないです。セキュリティ専業の会社ではないです。

Q.何やるの?
A.開発寄りのセキュリティ関係のお仕事をする予定です。
診断を中心にやるところからも内定はいただきましたが考えた結果、開発寄りの方を選びました。

Q.決め手は?
A.最終的な決め手は自分のやりたいことができそうなポジションを提案してもらえたことです。

Q.就活の期間は?
A.1社目のエントリーから本選考が全て終わるまで3ヶ月弱でした。 実際には学会発表などが間に入っていたので次の面接まで3週間弱待って頂いたりしたので実質的な就活期間はもう少し短いです。

Q.選考終了から決めるまでの間は何をしてたの?
A.決めるための情報を収集して整理していました。 具体的には各社の人事・エンジニアと面談をしたり、知り合いに相談したりしていました。 本選考を受けた企業は調べた上で入りたい企業のみだったので、すぐに決めるのは難しかったです。 客観的な数字を求めてIR情報も見たりしましたが、最終的には何をしたいかで選びました。

Q.その他
A.飯行きましょう。

2019備忘録

2019備忘録を書いていきます。 各期間内のイベントは順不同です。

  • 1〜4月
    • 卒研発表をした
    • インターンに参加した
    • 学部を卒業した
    • 修士課程に進学した
    • 国際会議に投稿する論文を書き始めた
  • 5〜9月
    • 論文投稿した
    • 長期インターンを始めた
    • Google I/O 2019に参加した
    • エンジニア向けのイベントで登壇した
    • セキュリティ・ネクストキャンプに参加した
    • 8,9月はサマーインターンにも行った
  • 10月〜12月
    • 投稿した内容の発表をしてきた
    • シュー活を始めた
    • 就活を始めた

実際にはここに書いていない嬉しかったことや挑戦したこと、辛いことも含めると2019年は色々ありました。 ご指導ご鞭撻くださった方々、イベントなどで色々お話してくれたり面倒を見てくださった方々、Twitterの絡みに付き合ってくれた方々ありがとうございました! 2020年も引き続きよろしくお願いします🙇

余白ができたのでシュー活の記録を置いておきます。

セキュリティ・ネクストキャンプ2019の応募用紙のサマリー

セキュリティ・ネクストキャンプ2019の応募用紙のサマリーです。
ざっくり何書いたかを書きます。
参考になるかわかりませんが要約したものを公開します。
セキュリティ・ネクストキャンプ2019の応募課題は分野の指定は特になく、自分のやってきたことや興味を問う問題が中心だったので、個人的には書きやすかったです。
そのため、他の方の応募用紙が見えないのでわからないですが人によって回答内容が大きく変わると思います。
以下が応募用紙の要約です。

質問は4つありました。 以下の問題文は全て、下記リンクより引用

セキュリティ・ネクストキャンプ2019 応募要項 :IPA 独立行政法人 情報処理推進機構

  • あなたに関する問い
  • 課題解決に関する問い
  • 興味ある分野に関する問い
  • その他に関する問い

あなたに関する問い

あなたは今までどのようなことをやってきましたか.どのようなことができて,どのようなことが得意で,どのようなことに自信がありますか. どのようなものを作りましたか.どのような情報を発信してきましたか. どのようにしてそうしたことをやってきましたか.なぜ,そのようなことをやってきましたか.やってきてどう思いましたか. 参加できた場合,セキュリティ・ネクストキャンプにどのようなことを期待し,どのようなことをやってみたいですか.

(4000文字くらい)
以下の順番で書きました。

参加できた場合に何をしたいか

自分の研究分野と絡めたい旨を書きました。 また、コミュニティの運営に携わっているので、 学んだことを還元していきたい旨を書きました。

何をやってきたか、どのようにしてやってきたか

今までやってきたことについて抽象化して箇条書きで列挙しました。
学校歴(大学〜)やコミュニティを含む所属等についても箇条書きで書きました。
論文リストへのリンクやCV、GitHubのリンクはこの設問に書きました。
加えて、学会や学内での受賞歴についても箇条書きで書きました。
2つピックアップして詳細を文章で書きました。
コミュニティ活動やコンテストの出場などに加え、 5月に2回イベントやエンジニア向けのカンファレンスでAndroidのセキュリティについて登壇したので、それについても触れました。

学部1,2年で出たハッカソンとか技術同人誌については触れませんでした。
(今思えば、加点方式なので書いても良かったかもしれない。)

課題解決に関する問い

自身で何らかの疑問・課題・問題を設定し,それについて取り組み,その過程を示すことで,自身の技術力や課題に取り組むやりかたを説明してください. 設定する課題は何でも構いませんし,解決しなくても構いません. 解決できたかどうかではなく,いかに課題に取り組むかという点を評価します.

(6000文字くらい)
過去のものを含めて2つの課題について書きました。

1.学部3年の時にIDベース暗号とプロキシ再暗号化の実装をしたことを振り返り、
その時に犯した3つミス(主に乱数の扱い)について失敗に至った思考の過程や指導教員と議論したり指導を受けて得た解決方法について考え、詳しく書きました。
(全て発表前に修正できたので再実験して事なきを得ました。) また、とりあえず手を動かして信頼できる人(この場合は指導教員や先輩)にレビューしてもらいながら知識を身につけることが多い旨を書きました。

2.Googleが発表した暗号利用モードであるAdiantumをTLSに組み込む遊びをした話を書きました。(こちらは未完)

去年のセキュリティ・キャンプ全国大会のTLS・暗号ゼミの内容が「TLSの実装をしてその上に好きな暗号を実装する」だった(違ってたらごめんなさい)のを思い出して、 行けなかったので、詳細わからないけど暗号を乗せる部分を自分でやってみようという気持ちで手をつけました。 こちらは未完だったのですが、できたところまで書きました。 Adiantumを選んだのはAdiantum自体が世の中に出てから日が浅いことと、Disk Encryption向けに開発されたものなので、遊び以外でTLSに乗っける人はすぐにはでてこないだろうなと考えたからです。
進捗はこんな感じでした。

  • TLS1.3の前に、TLS1.2を対象に挑戦
  • 追加する暗号はAdiantum
  • 時間がなかったので、Golangの実装に追加する方針で行った
  • 雑にCipher Suiteに追加してハンドシェイクの途中までできた(CHLO, SHLO)
  • 通信の内容を暗号化するところはまだできていない
    • Adiantumが採用しているHBSHはtweakを受け付けるなど、GolangTLSのCipher Suite関連のインタフェースには合わないため、以下1または2の方法を検討(注意:安全性については考察していないです)
      • 1.https://github.com/lukechampine/adiantum に合わせて、Golangのcipher suite関連のインタフェースにあらたにHBSHを追加する
      • 2.Block Cipher用のインタフェースに合わせるためのラッパーを書く
    • 時間作れなくて対応できなかったけど悔しいので、BlowfishをGolangのTLS1.2のCipher Suiteに追加して遊んだ

興味ある分野に関する問い

セキュリティ・ネクストキャンプの講義の一覧を見て,その中から興味のある講義を選び,その講義で扱うテーマに対して自分が考えること,興味,疑問,課題,自分なりの考察などを説明してください. その分野について知識があるかどうかではなく,いかに興味や疑問を持ち,課題を考え,自分なりに調べて考察するかといった点を評価します.

(600文字くらい)
次の講義について書きました。

講義5-1
暗号アルゴリズムFPGA実装
講師: 今岡 通博

正しく実装するだけでなく、乱数を無下に扱わないべきであると考えたことやハードウェア実装であるため、電力解析攻撃などに対する対策が必要であると考えていることなどについて書きました。
AdiantumのようなonCPUで高速に動作するように設計されている暗号利用モードとの差別化が必要だと考えていることについても書きました。

その他に関する問い

書きたいことは前の設問までで全て書いてしまっていたので、 この問題については空白で出しました。

おわり。

p1sces.hatenablog.com

今回はご縁があったのですが、 過去の話をすると、学部時代に全国大会に3回チャレンジして全てだめでした。
(正確には応募は2回。1回は締切直前にセッションが切れて間に合わなかった)
↑の記事は共感したので、一喜一憂せずコンスタントにやっていきたいです。

Google I/Oの参加報告(Privacy&Security中心)をしてきました@日本Androidの会 定例会1905

どうも prprhytです。
先日5/15の夜に行われた日本Androidの会 定例会でGoogle I/Oの参加報告をしてきました。

僕は今大学院のM1でこちらのブログにある通り、日本Androidの会から補助を頂いてGoogle I/Oへ参加してきました!

jagsc.github.io

定例会の詳細やスライドは次の通りです。 - イベント詳細: japan-android-group.connpass.com - スライド:

www.slideshare.net

時間の都合でStorageまわりやPermissionまわりは紹介しきれませんでした。 フルバージョン(...?)はGoogle I/O ExtendedでもあるABCで報告する予定です!
是非遊びに来てください!
japan-android-group.connpass.com

macOSで使っている常駐ツールの紹介

この記事は日本Androidの会 学生部 Advent Calendar 20182日目の記事です。

1日目の記事は日本Androidの会学生部の紹介でした。

こんにちはprprhytです。
今回はmacOSで使っている常駐型ツール(有償も含む)について紹介しようと思います。

有償ソフト

1. Sound Control

アプリケーションごとに音量レベルを変更できるアプリ。
Windowsでは標準でできるけど、macではできなかったので購入。
通話しながら作業したりゲームしたりするときに重宝してます。
ただ、Chrome等のタブブラウザのタブごとの音量調整には対応していないので注意が必要。

f:id:atofaer:20181202195956p:plain
Sound Controlのパネルを開いた様子

値段: $10

https://staticz.com/soundcontrol/

2. Trip Mode

通信量の制限アプリ。
アプリケーションごとに通信の許可をすることができる。
要はファイアーウォールソフト。
テザリングとかしながら外で作業するときに便利。
プロファイルの設定やループバックトラフィックの検知もできる。
f:id:atofaer:20181202200637p:plain

値段: $7.99 http://www.tripmode.ch/

3. VM Ware Fusion 8.5

仮想化ソフトウェア。
Windowsを動かすのに使っています。
ホストのRAMが8GBなのでしんどい。
Bootcampからの移行は外付けハードディスクは必要だったけど難しくなかった。

値段: 10,000円くらい

https://store.vmware.com/store/vmwjapan/ja_JP/home

4. スーパーセキュリティ for Mac

ソースネクストアンチウイルスソフトです。
BitDefender OEM
時々誤検知する。
けど、マルチOS対応版なら3000円くらいの買い切り型なので学生には嬉しい。

値段: 3000円くらい

性能世界一「ZEROスーパーセキュリティ」 - セキュリティソフト(ウイルス対策ソフト) | ソースネクスト

無料ソフト

Karabiner

キーマップとかいじれるソフトウェア。
今使っているmac book pro がJPキーボードでありながら、US配列のHHKBもつかうので
配列を切り替えるたり、HHKBの右AltをFnに置き換えたりするのに使っています。

https://pqrs.org/osx/karabiner/

Tunnelblick

OpenVPNクライアント。

https://tunnelblick.net/

RunCat

常駐してCPUの使用率に合わせて走る猫を飼い始めました。
かわいい。
f:id:atofaer:20181202203319g:plain

https://itunes.apple.com/jp/app/runcat/id1429033973

wifi-then-bluetooth

自作スクリプトです。
特定ssidに繋いだときにbluetoothをオンにするbashスクリプトです。
automatorでアプリ化してログイン時に立ち上がるようにしています。
自宅では外付けのmagic trackpadを使っているので自宅にいる時だけbluetoothをonにするために書きました。

https://github.com/prprhyt/wifi-then-bluetooth

明日はtakanakahikoくんの 「自己紹介のWebページを作りながらGitとGitHubを学ぶハンズオン」です。

mixi git challenge #10に参加してきました!

こんにちはprprhytです。
第10回 git challenge に参加してきました!
問題の内容については口外できないので日記風。

TL;DR

  • とても学びがあってエモかった
  • gitの低レベルコマンドとか内部構造とか学ぶ機会になった
  • 飯がうまい

参加まで

応募は初めてでした。
実は1度祈られたのですが、空席ができたため繰り上がりました。
どなたか存じませんが圧倒的感謝...。この時点で既にエモい。

当日

事前の連絡でチーム戦とは聞いていたのですが、
それって知らない人とチーム組むってことだよなぁ...
と思って少し不安でした。
2人チームでした。
実際には相方はとても社交的な人でした。感謝。

競技前

開始前は交通費の受け取りとかノベルティとか見てました。
交通費の支給は本当にありがたかったです。🙏

イベント開始後、運営スタッフのLTとチュートリアルがありました。
サービスにおけるGitの活用やGitでドメイン管理する話を聞きました。

相方とスタッフかつ午前にLTをされていた神谷さんとお昼をいただきました。
お昼はオーベルジーヌのカレー弁当でした。 お肉が大きくて、ルーもうまくてスパイシーでした。
過去のgit challengeのお昼で好評だったそうです。わかる。

競技開始前に作戦会議をしました。
方針としては、易しい順でソートして奇数個目の問題を解く役と偶数個目の問題を解く役にわかれました。
(当日あったばかりでお互いの実力とかわからなかったので...)

競技中

担当範囲のうち2,3問目くらいまで順調だったのですが、後半は解けない問題が出てきて飛ばしたり相方に解いてもらったりしました。
わからん問題を相方に問いてもらっている間に☆3の問題を1つ解けたのはよかった。(これは罠で他のすべてのチームも正解してた...)
一部の上級問題以外の難易度はちょうど良かったです。(解けなかった問題も解説聞いてなるほど〜ってなった)
インターネッツの使用は許可されていたので、いくつかの問題はググり力〜でした。 (一部の上級問題はあきらかにそうではない感じ...)
相方に助けてもらう場面が何度かありました。圧倒的感謝🙏

競技中にはお菓子やカフェインマシマシパリピドリンクHECATE(ソフドリ)も振る舞われました。

競技終了後

解説聞いてもう少しでできたのに...!と思う問題もありました。学びになりました。
結果は5位(同立2チーム)でした。1位は圧倒的でしたが、3位(同立2チーム)とは僅差だったので☆3があと一つ解けていれば3位だったのにねーみたいな話を相方としていました。
あと、LTもありました。
リポジトリのデータ解析(ネガポジ判定)の話や
KuniwakさんのGitに詳しくなるまでの話を聞きました。千里の道も一歩からなんだなーという気持ちになりました。やっていき💪

懇親会は疲れがピークでしたが、お酒の力で(一時的に)復活しました。
飯がオシャレな上に美味しかったです。

お話した学生の志望分野はmixiさんのイベントに参加しているだけあって、web系志望の学生がほとんどでした。(それはそう)
mixiのエンジニアの方や他の学生と交流できて有意義でした。
年収とか採用の本音...?(書類でどういうところ見るとか)とか根掘り葉掘り聞けました。よき。

最後に

継続は力なりなんだなーということがわかりました。 僕の語彙力では表現しきれませんが楽しかったし学びが多かったので、後輩にも勧めていきたい。
やっていくぞ💪