asu_paraの日常

日々感じたことをまとめて投稿するときに使います

-seccamp全国大会2021まとめ-

B2が終わろうとしています。asuparaです。

 

オンライン開催でしたがやはり対面でやりたかった人も多かったみたいで........まあ、たしかに.....自分もです。今回のブログですがたくさん優秀な学生が体験記を書いてくれているようでしてその部分はその人たちに任せます。グループワークで内容の濃いことをしたのでそのことについて多めに触れつつどのようなことを自分たちでやったのかについて多く特筆していこうと思います。

 

はじめに ーセキュリティキャンプの紹介ー

この業界にとってはseccampは夏の季語だそうで。セキュリティの業界のみならず業界全般への登竜門としてu-22の学生を対象にプロが集中講義を展開する人気のイベントです。セキュリティキャンプに興味をもってくださった学生の皆さん!ぜひ公式のサイトをご覧になっていろいろ見てみることを勧めます。メインの選択コース、集中コースに加えジュニアやネクストなど幅広い年齢層の方が参加できるようになっています。また、全国大会のみならず地方大会も開催されています。個人的には、参加するしないにかかわらず興味があることに自分の手を動かして考えてみることができるのかということが技術者としては大事なのかなと思ってます。もしかするとそういう姿勢が応募のときに生きてくるかもしれないです.......皆さんの参加を

 

 

ー謝辞ー

応募して参加することができたこと、これは非常にスタートとしてかけがえのないいい体験となりました。全国大会2021の参加者の皆さん、講師チューターの皆さん、協賛企業の皆さんに厚く感謝します。

 

--全体のセッションやグループワークについて--

f:id:karasuparan:20210817064436p:plain

初日は偉い人とかの講演をきいたりグループワークしたりって感じでした。

早速やらかしたのですが......

 ということでしょうがないのでスマホで開会式に入ることに........

 参加者にいじられるなど

 

まあ、そんな茶番は置いておいてですね.........普段どおり勉強しているだけでは聞くことのできない法律の話であったりとかイベント開催の裏側の話などいろいろきけたのでよかったと思います。そういった人を呼ぶのはかなり難易度が高いことを聞かされ認識を改めました。キャンプはすごい人がごろごろいるので感覚がおかしくなります。

 

LT大会は何を言っているのかよくわからない人もいたような.....( ´∀` )面白いものもたくさんありました。

 

--グループワークでやったこと--

グループワークのメンバー 

@sitositositoo   @iwashiira  @ultrasupara 他 

現在グループワークとしての取り組みは一旦終了しています。今後はグループワークとしてやったことを実践の場で生かしていきたいと考えています。具体的には個人やたまにはここでやったメンバーを募ってCTFに参加してみるということです。しかしこの場でやった内容はコンピュータサイエンス的なバックグラウンドをもったものであったのでこれらをもとに今後、個人が研究などの学術的な活動や既知の脆弱性調査などにも生かしていけものにも応用できると考えました。

 

--iwashiira先生によるpwn講義--

2回にわたるセッション7時間 でpwnの演習(iwashiira ctf)をしていただきました。すべての内容は一般に公開できるものではありませんが演習の概略を書き記しておきます。詳解セキュリティコンテストという最近出た本のpwnをいちから読み進めていくための補助的な役割にもなり得るものだと先生はおっしゃっていました。これを読むとどの手順で勉強すればいいのかの大まかな流れが示されるので参考になることもあるかもしれないです。

www.amazon.co.jp

 

流れ

1.PCの物理的な構成

この章ではコンピュータをつかさどる構成としてCPU、Memory、補助記憶装置、マザーボード、電源といったものが電気的につながっておりそれらがどのようにデータの読み書きを伝え保存しているのかということを学びました。通常の自作PCの構成やノートPCや物理サーバーの構成を見ながらどう有機的につながっているのかについてみていきました。(例えば記憶に関する項目では記憶回路を半導体レベルで見るということまではしていませんが自分が勉強していることとかなり密接につながっており今後もこの分野の理論は理解を煮詰めていきたいところなのでいろいろとまとまったらこれらに追記してまとめたブログをあげたいと考えています) pwnで物理的なデバイスの話からする人に初めてであったというのか感想ですが実際はこれが本当の形かなと思いました。もしハードをやっている人に低レベルなソフトウェアに興味をもたせるときにこのような導入をしたら興味をもってもらいやすいんだろうなという感想を抱きました。

 

 

2.コンピュータアーキテクチャ

コンピュータにおける基本設計や設計思想として命令セットアーキテクチャがあることを大きく取り上げx86-64命令セットアーキテクチャの特質するべきもの(レジスタの形式ごとにどの数値を入れることができるのか、プログラムカウンタ、RAX,RCX...といったものがアドレスでありどのような役割を持つか)についての思考の整理をしました。それとともにx86-64命令セットアーキテクチャ機械語と1-1対応するアセンブリについて学ぶとその仕組みがわかることについて理解しました。コンピュータアーキテクチャに関しては情報科ではどこでも開講されるような科目ですがここではpwnを理解するためのものとして最小単位の必要理解をコンパクトにまとめられておりかなり良かったと感じました。余談にはなりますがうちの教授激推しの教科書、パターソン&ヘネシーの紹介を添えておきます。

www.amazon.co.jp

 

 

3.アセンブリを見る

簡易なプログラムのwatch.s(仮)を見ながら実際の機械語がどのように動くのかについてみた。実行して生じたelfファイルをobjdump、hexdumpで観察した。radare2を使ってみた。(ここは好みでgdb-pedaを使ってもいいがというか自分はそうだが先生はradareを好んでいるようです。やったことをめちゃくちゃ薄く書きます。

 

gcc watch.s -o watch -no-pie  でファイル生成 

watchが生成された!

objdump -S -M intel watch

main以外にもたくさんコードがあって機械語と命令コードやオペランドとの対応が1-1であることについてみた。

hexdump -C watch 

べタなバイナリの観察。ファイルの中身(16進数)とそれに対応するASCII コードの見方について学んだ

 

radareでの操作

r2 -dA watch

s main でメイン関数部分を見る。pdfで表示

db <main address>ブレークポイントを張る。

dc でhit breakpointさせて実行をいかせる。

v! RIP(プログラムカウンタ)をだしてそれをもとにメモリアクセスをしにいって機械語を呼び出す一連のながれを観察した。

x86_64のアーキテクチャは可変長のものであり1byteの命令もあればMAXで15byteの命令もあることについて視覚的に確認できた。

 

特に面白かったのは命令ごとの違いでのbyte数の違いで大きなプログラムを設計するときにこのような微妙な数の違いがソフトウェア全体に与えうる影響について考察したことですかね。例えばcmpとtestは同じような指示を与える命令だが4byteと3byteといった違いがあることについてみたりした。

 

 

4.スタックというメモリ構造

スタックを理解することはpwnにおいてもかなり重要な問題であるのでかなり重点的に扱ったと思います。データ構造やアルゴリズムの内容ですね。スタックは個人的にも実装したことがあるのでやってみると一番よくわかると思います。実装例↓

github.com

 

pwnにおいて大事なのはRSPとRBPレジスタを使っていることでありPOPとPUSHというRSPを扱う専用の命令があることである。CALLやRETが関数に関連がある命令でありスタックに影響を与えること。アドレスは大きい->小さいのほうにメモリの構造が動いているということなどを整理した。

 

 

5. C言語の関数などの機能がどのように機械語で実現されているのか

stackのプログラムは

f:id:karasuparan:20211214031957p:plain

であるとして gcc -o stack stack.c -no-pie -fno-stack-protector でstackの実行ファイルを作成する。

f:id:karasuparan:20211214025919p:plain

上図を基に考察すると、ローカル変数の上にsumの引き数ぶんの領域をとる。call命令によってメイン関数に戻った際にのちに実行したいRIPの値をスタックに格納する。メイン関数からsumへのサブルーチンへの実行が移るわけだがただ実行するだけだとRIPの値が書き換わるだけであるのでサブルーチンを実現するときに元のルーチンに戻ってくるような所作ができるようにするためである。次にRBPの値もスタックに格納する。(push RBP )スタックポインタの指している値を8小さくすることによってスタックの領域を増やすことによってこれを実現する。さらに小さくしてsum用のローカル変数の値をスタックに追加する。(func1)このようにスタックを組むことでleave,retして元に戻せる過程の追跡を行った。

 

 

6.OSの機能を呼び出すシステムコール

システムコールカーネルの機能をユーザーモードから使うために発行するものである。Cの共有ライブラリの関数はその中でシステムコールを呼んでいる。例えばprintfではWriteシステムコマンドを呼んでいる。今回はHello World! を表示するようなsyscall.sの読解をした。(r8とrbxに特定の値を入れてpushしてsyscall。exit 0 で終了してsyscallしたもの)生のデータをradare2にかけてやるとその動きがより詳細にわかった。また、straceコマンドを実行してやるとどのようなシステムコールを呼んでやったのかが一目で分かるように表示してくれるのでそれで改めて呼び出しの観点からプログラムを見るということをやった。

 

 

7.ELFファイルとその構造、それにまつわるソフトウェア群

.c(ソースコード)->.s(アセンブリのコード)->.o(オブジェクトファイル)->実行ファイルの流れで変換できるがその際、コンパイラ(cc1)、アセンブラ(as)、リンカというソフトウェアがその操作を与える。すべてgccによって操作を与えることができ #includeなどを指定すればコンパイルの前にプリプロセッサによるプリプロセスが走る。cc1をとりあげ広義の意味のコンパイル、狭義の意味のコンパイルについて学習した。オブジェクトファイル(ELF形式)まではファイルの中で完結しておりリンカによってリンクすることによって1つの実行ファイルにまとめることができることについて学習した。ELF自体はその実態は0と1のバイナリでありプログラムによって解釈されるファイルでありファイルのどの部分に何の情報が入っているかがわかるように決まったフォーマットをとっている。ELFは様々な情報を含んでいるのでその内容を理解するにはコンピュータの動く仕組みも理解する必要がある。

 

ELFの構造は以下のとおりであることを学んだ。

• ELFヘッダという全体の情報を管理する領域がある。
• プログラムヘッダの配列としてプログラムヘッダテーブルが存在し、プログラムヘッダはセグメントというものの情報を保持している。
• セグメントはローダによってロードされる際の単位であり、ローダ用の区分である。
• セクションヘッダの配列としてセクションヘッダテーブルが存在し、セクションヘッダはセクションというものの情報を保持している。
• セクションはリンカによってリンクされる際の単位であり、リンカ用の区分である。
• 普通、プログラムヘッダテーブルは存在していればELFヘッダの直後に存在し、セクションヘッダテーブルは存在していればファイルの末端に存在する。 

 

もっと詳しいやつ↓

smallkirby.hatenablog.com

 

方法1  readelfコマンドで実際に見てみた

readelf -h filename          readelf -S filename        readelf -l filename などで確認した

 

方法2  Ghidraから眺めてみた。

GhidraについてはC3講義Zero to Malware Analystで使い方のレクチャーがあったがそれを実際にpwnを考えるときにも使ってみた。

 

8.pwnの中身  (ツール、攻撃の種類、CTF問題演習)

Stack based Buffer OverflowReturn Oriented ProgrammingFormat String BugといったpwnableのCTF問題で頻出の問題の攻撃手法について勉強した。それぞれの攻撃や脅威がどのようなものなのかについては、ほかの人もたくさんブログを書いていると思うのでそちらのほうを参考にしてください。これらの頻出問題のCTFを解くことによって実際の手の動かし方を学習しました。またCanaryやRelocation Read-Onlyなどのセキュリティ機構について学習しました。pwnではいちいちradare2で解析したものを手打ちして解くこともできるけど問題がより複雑になると打ち間違いなどの思わぬミスを招いてしまう可能性もあるのでpwntoolsというpythonのライブラリを用いたコードの書き方をライブコーディングしました。かなりためになる勉強会でした!

 

かなりためになった資料

qiita.com

ここに上で示した攻撃の色々はまとまっています

furutsuki.hatenablog.com

ptr-yudai.hatenablog.com

 

これでグループワークでやったことの紹介は終わりますがこれは概略を示しただけですのでもっと詳しく書き記したものを別のブログにて更新していきたいと考えています。pwn初心者もいた中でよくやったほうなのではないでしょうか!!!!!!!!pwn分野に関する学習の継続の過程が作っていければと思います。

-------------------------------------------------------------------------------------------

 

自分が受講したもの

f:id:karasuparan:20210817071003p:plain

 

f:id:karasuparan:20210817070450p:plain

A2 任意USBデバイス開発実験

かなりの低レイヤーに関する実験でした。生の通信をするコードを見るという体験はなかなか斬新なものだったと思います。Wiresharkは高レイヤー、Arduinoを使ったら負けということで自分の手をうごかして開発ボードの上でどう動くのかを見る。動かすソースファイルはCだったですけれどもそれがだす信号は回路的にはどうなっているのかについてみるということをしました。動かした内容も多岐にわたるものでしてLチカから始まり4*4のキーから制御を送った信号を見たりマウスを制御したりと楽しいものが多かったです。自分でオリジナルの制御を与えることができるとよりその面白さがわかる実験だったと思いますね。

 

f:id:karasuparan:20210817071806p:plain

C3 Zero to Malware Analyst Part1/Part2

 これは大人含めいろんな人が聞きたい講義なのではないでしょうかね.......自分はGhidraのような実践的なリバースエンジニアリングツールを使った実践的なマルウェア解析はやったことがなかったのでその基本から聞くことができたのは激アツな経験でした。ざっと昨今のマルウェア関連の脅威についての説明があった後に「マルウェア」の分類やタイプに関する知識の整理をしました。XORなどのエンコーディングRC4などの暗号アルゴリズムマルウェアと深いかかわりがあることについて知りました。まとめると一般的によく使う手法について学習しました。どのように解析するのかについて表層解析、動的解析、静的解析をあげてケースバイケースでどのようなときにこの手法(ツール)を使うと有利・不利かなどについて学習しました。それで今回は静的解析を主に取り上げGhidraを用いての解析方法やテクニックについてすすめました。静的解析は幅広い技術的知識が必要ということで事前課題ではx86_64アーキテクチャやCやアセンブリに関して、Windows OSの内部情報の基本事項やツールの使い方などについてを講義で取り扱いました。それを使ってサンプルでのGhidraを使った実践をグループに分かれてやったりしました。自分の将来的な目標的にはCTFのpwn問題を解いていくときにradare2を使いつつGhirdaをきちんと使って解析ができることですかね。講師のかたが著者の本「Ghirda実践ガイド」をいただいています。途中までしか読んでいないので春休みにあったら残りの部分を読んでみて自分が挙動に興味があるプログラムや与えられたサンプルでもCTFでも自分が納得がいくまで動かしてやってみようと思います。

 

f:id:karasuparan:20210817072225p:plain

A6 チップレベルでカスタマイズができることで見える世界の体験

これに関しては筆者が学校でやっている内容とのかぶりがありましたね。ソフトウェア的な側面としてコンピュータを見るときOSやコンパイラなどのソフトウェア主体で見ていくと思うがハードウェア主体で眺めてみると集積デバイスのことになります。ムーアの法則の話がありましたけれどもここで例を挙げるとiPhoneXののTr数が43億個でプロセスは10nm、iPhoneXsのときのTr数が69億個、iPhone11のTr数が85億個、この時のプロセスは7nmという感じでこれらはムーアの法則の線形性に従います。面白かった話としてはソフトとハードの乖離ができつつあるという話でそこには越えられない壁があるのかという話でした。プログラムがただしく動くには動かすためのソフトウェアのみならずトランジスタレベルでのハードウェア設計が確実なものでありたいのでやはりソフトとハードはつながっています。しかし、両者の専門性はかけ離れており...といった興味深い話でした。コンピュータの複雑化やブラックボックス化に伴う脆弱性としての側面がintel のCPUにもでてきていたーといった話しがありました。

hardware.srad.jp

ではその気持ちがわかるためにはどうするのかという話でCPU自作の話があった。HDLで論理回路を書いて高位合成して回路を作るといったやり方の全体像を示された。私はFPGAにRTL記述したことがあるがその時と同じようなもので、論理設計とシュミレーションしたものを論理合成して配置配線することによって作ることができるということをシミュレーションしてみた。

 

f:id:karasuparan:20211213155239p:plain

C7 オフェンシブ・セキュリティを「研究」する

本講義では学術寄りにサイバーセキュリティの研究をするということはどういうことかの基本から文献の検索方法など聞きたい話をたくさんパック詰めにしたものを提供していただいた。オフェンシブセキュリティのホットなキーワードとして「サイドチャネル攻撃」がある。もともとサイドチャネル攻撃は電磁波解析などハードよりのものだが近年はそのレイヤがソフトウェアのさらにWebのレイヤにも浸潤し始めているということでBugBountyの対象になることも多いという。このセッションでは実際にサンプルのサイトを用いて認証に関するクイズ?を実施して解析方法を考察してみたりした。Webにおけるサイドチャネル攻撃に関してどういうものか知らなかったが実際に手を動かしてみたらすんなりと腑に落ちる内容だったので面白かった。CTFなどでは攻撃手法というものがあってそれを勉強して実際に解き方があって問題をとくがあるが研究では「攻撃があってそれはどのような事例に活かせるものか・解決するには」ということを考えないといけないのが難しいところだと思った。この順番での発想は研究をしたことがない学部二年生の私には難しいものであり実際にこのような研究でいかされましたという研究紹介を受けたり論文を見てみて研究者のすごさがわかった。しかしすべての研究には基本的な技術に基ついた着想があるはずだというのも響いた。今回は「研究」の世界の全体外観が少し分かったし自分が思っていなかった大事なことがたくさん出てきてよかった。

 

D1-1 1-2 1-3   AIシステム・ハッキング入門

Long (8/10-8/22-9/19)で3回にわたって横断的に実施

トラックホームルームでセキュリティキャンプに参加した理由といった話しがあったと思うが「CTFなどでからは学習できない部分の実践的な技術に触れることができる」というものがあったと思う。それを一番実感できたのがAIシステムハッキングに関する横断的な話だった。

 

1日目ではAIを利用した攻撃として事前学習モデルの汚染(Attack)をしました。そのための機械学習フレイムワークがありDeeplearningに特化したTensorflowについて基本機能をGoogle Colabを用いた演習を行うことによって習得した。任意の計算や関数を分類器の層としてあつかうことができるLambdaレイヤに任意のコードを埋め込んで攻撃するデモの実験をした。また、Tensorflowはおおくの充実したAPIを提供しておりそのファイル操作のAPIを悪用した攻撃のデモを実践した。

 

2日目ではまず入力データに微細な摂動を加えることによってご認識を誘発する敵対的サンプルについてその理論を学習した。簡単にいいかえると「AIをだます」とはどういうことなのだろうかということである。敵対的サンプルを作るのに必要なニューラルネットワークや誤差が小さいとはどういうことか・大きいとはどういうことかを理解した。Black Box Attackを実現させるための必要条件とその手法としてのJacobian-based data augmentationについて学習した。ここまで難しい言葉が並んだが要は「AIに誤認識させるための工夫」の過程を一つ一つ見ていったということができる。敵対的サンプルを作った結果の侵入例として顔認証システムを攻略した。ではこの脅威に対してどのように対策していこうか、それは「多層防御」による観点である。多層防御とは下の文献によると

""Defense in depth is the concept mof protecting a computer network with a series of defensive mechanisms such that if one mechanism fails, another will already be  in place to thwhat an attack.""

 

と述べられており、その要件はメカニズムが1つkillしてもほかの要素で脅威の対策を補完できるような構成を組むことである。対策の例としてAdversarial Trainingやフィルタ処理の観点を学習した。ほかの観点についてもキーワードを提示していただいていたので自分なりに調べた。結果的にわかったことはこの要因は状況ごとに変わってくるので難しいということである。

  1.  

3日目はDeepfakeについて本格的に学習しFake動画を作ってコンテストを開催した。e-KYCシステムというオンラインの本人確認システムについてbypass実験をした。また、コンテストでの結果をもとにDeepfakeへの対策について考えた。しかしこれについて自分は個体差による違いがあることが難しい問題だと感じた。システム自体の脆弱さは生体情報と連携するなどソフトウェアとしての機能追加や向上をはかれば改善されるケースもあるがそれだけでは解決しない問題を感じた。総じてAIシステムのセキュリティはまだまだ課題が多くその解決を図るのに難しい部分もあるがこれから時代が進歩して技術が一般に普及してサンプル数が増えていくことによって解決することができることもあるだろうという推測を立てた。

 

多層防御について↓

www.sans.org

 

講義の理論部分の内容のほとんどは講師が執筆したこちらのブログに記載されている

jpsec.ai

 

おわりに

勉強したことがたくさんありました。高度な技術にガンガン触れたし普段生きてて出会えない人たちに会うことができた。しかし、技術的な側面だけでなく精神面でも学んだことが多かったので書き出しておきます。

 

1.脅威解析をやろうという人でも実装力はとても重要

2.いろんな暗号アルゴリズムを知ること、そのためには数学からも逃げない

3.主体的にやっていく人はやっぱり強い、分野の継続と深堀りを

4.同じ興味や関心を持っている仲間は大切

5.謙虚な姿勢で取り組むことが大切

 

結果的にたくさんの技術に触れて・知って感じることが多かったので参加してよかったと感じています。これで興味をもった人は応募してみてください。

 

修了証書をゲット