Upgrade to Pro — share decks privately, control downloads, hide ads and more …

解析者視点のための独学

 解析者視点のための独学

解析者がどのように技術習得すればいいのかとその独学モデルがあらゆる学習の場で使えることを示すための1例として「プログラムの解析手法とプログラミング言語の習得方法」の話をした。@Ritsumeikan Security Team 2022 脅威解析クラス

asupara

June 16, 2022
Tweet

More Decks by asupara

Other Decks in Technology

Transcript

  1. 独学技術習得徹底考究 @ultrasupara 2022/6/15 Ritsumeikan Security Team

  2. 本資料について 目標 ⚫脅威解析にこれから立ち向かっていく新入生に向けて独学で技術習得で きるようになってほしいのでその方法の1つとして参考にしてほしい ⚫何をすればいいのかわからん!!という新入生も多いはず。その解消 ⚫うまくいくモデルの抽象化->それがプログラミング習得という一つの例 で どうしてこのLTを作ろうと思ったのか 新入生の方のツイート 高等学校/専門学校までの勉強と大学からの勉強は性質が違う

    「自調自考」を身につけるとこれから社会で生き残れる エンジニアになれると思うから 学生実験で良いレポートを書くことにもつながる->正課も加速する 2022/6/15 Ritsumeikan Security Team 2
  3. 独学 “”語””からみる独学 ⚫Self education ⚫≠learning <- 学校教育 かつ 学習して終わり ⚫Education

    <- ..usually at school, college.. 2022/6/15 Ritsumeikan Security Team 3 ならば selfがつくとどうなる? 結論から言うと行為の主体が””反転””することに加え“”解決“”の解釈が加わる 結果的に自分で問題を見つけ自ら探究をし問題解決できる人間を目指す
  4. 独学のFlow 1番大切なこと::とにかく“やりたいこと”を見つける さらに独学手法は3つのパートに大別できる ⚫1.調査 ⚫2.実践(挑戦) ⚫3.考察 独学の大まかなFlow やりたいことの発見->調査->実践手法->手を動かして実践->結果をもと に理解できたか・何を習得したか考察->思考の整理・発信->Feedback これから調査・実践・考察の順番にパートごとの“視座”の向上方法を示し

    経験することによって確実に知識と技術の両輪を習得できることを証明す る 2022/6/15 Ritsumeikan Security Team 4
  5. やりたいことの発見 運よく“サイバーセキュリティの何か“であることが決まっている ⚫RiSTは幅広い情報分野のなかでセキュリティに関することをすることは 決まっている ただしここで問題が…->セキュリティの領域が広すぎる! そこで ⚫初学者向けに CTF取り組みの前提で必要なことをやるパート ⚫Web Securityを扱うクラス

    ⚫脅威解析を扱うクラス に大別した 大別した理由 ⚫これからは“スペシャリスト”が明るみになる時代 ⚫いろんな分野ができる人より1分野がしっかりできるように積み上げるこ とが大事(もちろんいろんな分野に興味を持って欲しいけどまずは1分野) ⚫初心者からでも2-3年後に“少しわかる”分野を作ることで将来の指針に 2022/6/15 Ritsumeikan Security Team 5
  6. 問題という問題を認識すること(調査編) やりたいことが決まった我々が次に直面する問題 -> 「独学における問題ってなに??????」 ⚫問題すら与えられない 答えだって自分が納得するまでやることにある ⚫「自調自考」が必要である 高等学校までの教育現場における問題 ⚫教員が出すテストの問題が解ければよかった ⚫極めて一元的で単調であり面白くなく”与えられたものを解く”というこ

    とができる人が強者として評価されてきた つまり ⚫当該分野を知り実践を通じて体得するために“解く”べき問題の探索 ⚫それは本当に知りたい分野に真に直結し核となる力をつけ問題を解決す ることにつながる問題なのかという調査に基づいた自問自答をすること 2022/6/15 Ritsumeikan Security Team 6
  7. 次のステップでの視座の考究(実践・挑戦編) いざ実践!!! ⚫やりたいことが見つかりその手法の収集が終わった ⚫しかしいざやってみるとエラーが出てよくわからない(大抵) 詰まった->解決の瞬間に“独学”による解決の能力が発揮される ⚫実践とは挑戦でもあるので可能な限りの手を打ちたいがその方法がわか らない ⚫知識と技術の両面を知る必要性 ⚫今、我々が知りたい”技術”部分はブラックボックスである つまり“知識”およびその“理解“とは何であるかその

    本質を知って”知識”と“技術”の結束点を探索する必 要性がある 2022/6/15 Ritsumeikan Security Team 7
  8. “”知識””とは何か””理解””とは何か1 ミクロにみてもマクロにみても学術は枝と葉の関係で結束 ⚫中心にはやはりコンピュータ(CS)がある ⚫CSを知るためのセキュリティ 応用のためのセキュリティ ⚫幹と枝と葉は結束しているがそれは双方向かつ多方向に結束 ⚫線は太い点の相互連続で点はもっと小さいマクロの連続 次に知らないといけないこと ⚫それぞれの“”分野“”はどのように醸成されているのか ⚫それを踏まえた“”知識“”の恒久的定義

    ⚫それらを統括した解釈と教訓 2022/6/15 Ritsumeikan Security Team 8 CS sec AI 数学 画像
  9. “”知識””とは何か””理解””とは何か2 “分野”とはいかようにして醸成されるか ⚫分野とは重なりから生まれる ⚫重なりから生まれる技術構成点 ⚫この構成点のことを”分野”という “知識”の定義 ⚫分野の最小構成点 ⚫例:フーリエ級数の中にさらに 必要な要素がパッキング 知識->分野->技術というように

    知を司る形態ができている 2022/6/15 Ritsumeikan Security Team 9 数学 三角関数/微分積分 計算技術 フーリエ
  10. “”知識””とは何か””理解””とは何か3 真に本質理解するってなに?????? ⚫数学の公式はどうやって証明され発明されたのかを思い出す ⚫基礎の知識を学習し分野の知を重ね合わせ、自分の手元で数式を動かし それによる考察に基づいて誕生した ⚫本質理解には前提に自分の手元で挙動を検証するプロセスが必須 ⚫詰まって止まっている状態のその振る舞いや挙動には理由がある ここまでで得た教訓と本質理解の答え ⚫知識->分野->技術は2つに分断される。前者2つが基礎 後者が応用

    ⚫基礎と応用は抽象と具体の行ったり来たりであるとも解釈できる ⚫さらに追加するとこれから学問をやる上で最も勘違いしがちなのが基礎 とは暗記ではないこと ⚫理解の上に理解を積み上げるために基礎を理解し初めて手を動かして理 解できるスタートラインに立つことができる ->本質理解 2022/6/15 Ritsumeikan Security Team 10
  11. 詰まった->解決 その瞬間の解読 本質理解との結束 ⚫結局は解決につながる”知識”が不足している ⚫では知識がないことが問題なのか?????? ->X ⚫知識がない結果立ち往生している今の状態 ->これ。 その状態からの脱出 ->目標

    ⚫結局、全部繋がっているので幹と枝と葉の論理プロセスを思い出す ⚫1.手元にない知識の検索 ⚫2.結束を強烈に意識し自分の経験とも照らし合わせながら関連分野を徹 底的に洗い出し解の検討を試みる ⚫3.解の検証の際は””必ず””手を動かしながら実験をし1回1回の自分の操 作に対するPCの挙動を考察する ⚫4.成功したならそれを技術適用して次のプロセスに進む ◼目標の達成!!!!!! 2022/6/15 Ritsumeikan Security Team 11
  12. 中間まとめ 独学を理解するための語の解読 ⚫独学につながる「調査・実践・考察」「知識」「分野」「技術」「解 く」「本質理解」といった言葉についてしつこく解釈を試みた ⚫結果的に我々は「自調自考」の根本を理論的に理解した ⚫それを実践の場で活かす例として「プログラミングの習得方法」「コー ドの解析手法」を実践を通じて考究していこうと思う。 RiST2022年度解析クラスの方針はとても良い ⚫独学してもらう技術書が1人1冊配布される。 ⚫本質理解をしたと思われる部分をパワーポイントにまとめてゼミ形式で

    発表 ⚫その理解は真の本質理解なのか議論を通じて理解の甘いところを詰める ⚫最終的には数十冊の解析分野の技術書からの知見がゼミを通じて入って くることになる(最強の仕組み) ◼折れずにちょっとずつコードを書くことも並行しながらやっ ていきましょう 2022/6/15 Ritsumeikan Security Team 12
  13. コラム::知の主体・知の装置 「内破する知」からの引用 ⚫「知」という言葉そのもの解体することができ、その重なりがある ⚫知を内在させた身体は「語る」->しかし語り始めにはその主体は形成さ れていない。語りの過程の中で主体が生み出され創られる ⚫言葉を解釈する間での葛藤や主導権の奪い合いの中で知の主体に「ゆら ぎ」が生じる。 ⚫この「ゆらぎ」が建設的な空間として制度化された知の常識ともいえる 「知の装置」を食い破っていく極めてクリエイティブな所作 知の装置の””問いかけの連続””に本質がある

    ⚫知の主体の日常的実践を通じて絶えず構成され直していくものとして捉 え直すことによって知の主体の集合的な身体の中で作動するものとして 創り変えていく実践 ⚫知の装置を問う == 知の主体の中での権力や制度を問うこと ⚫問いかけを連続することで装置の自動律を狂わせ我々が真に必要として いる欲望している経験の”場”へ知の装置を転換することができる 2022/6/15 Ritsumeikan Security Team 13
  14. コラム::心身・コミュニケーション・習慣化 ブレずに取り組みを継続するために必要なのは心身の健康 ⚫自分ができる範囲で無理せず継続する ⚫食生活に配慮する・バランスの良さも考える(特に下宿の人) ⚫運動習慣・強靭な体力をつけておく。最終的に実力勝負からはずれた次、 勝敗を決するポイントがあるとするなら間違いなく体力 ⚫技術以外の趣味を持つ 人と話す ⚫部室に来るといいと思う、くれば充実する ⚫自分で勉強するだけでは入手できない情報を入手するなど「対話」を通

    じた交流からしか得られないものもある 文化など ⚫同回生で話せる人をRiST内に作る ⚫メンタル維持に直結 習慣化 ⚫なんでもだがやり続ける人は強い ⚫xryuseix の資料 https://xryuseix.github.io/lt/github-111days/ 2022/6/15 Ritsumeikan Security Team 14
  15. コラム::技術習得へ最短ルートを求めることへの警鐘 上達への道(⏬@ultrasuparaの意見です) ⚫回り道を厭わず、それを楽しもう ⚫何かしらの物事を見届け続け、内容を仲間と語り合い、考察し合い、視 座を高めてよう ⚫焦ってやる必要はない(と思うよ。周りと比べるな ⚫見ておくべき重要作品「しか」観ない人はにわか。コスパとか考えない 2022/6/15 Ritsumeikan Security

    Team 15 ネトゲの新人さんもこんな人たちが多かった。短期間で最強になる事しか興味が無くて、実際急成 長してキャラは強くなるんだけど、中の人の数値化できない経験の差は埋めようもなく、挫折して あっという間に消えていった
  16. ここからは抽象->具体をやる これまで述べてきた独学へのモデルをあらゆる“学習”の場で生か すことができることを紹介する ⚫今回は例としてRiSTの内容にも直結するのでプログラミングの解析と言 語習得の方法についてみていく ⚫モデルが真に本質をついているものならば数学にもセキュリティーにも 他の勉強でも人間関係にだってあらゆる学びや生活の場面に活かせるは ずである ⚫結局、何かを判断するプロセスというのは人生の至る所で使うのでいつ でも根本の発想が使えるのではないか

    ⚫具体例を通じてこうすればできる、しかもそれは先ほど述べた抽象との 対応関係がちゃんとあるんだなということがわかるその喜びや結束の美 しさを共有し実感したい 2022/6/15 Ritsumeikan Security Team 16
  17. プログラミングの習得方法 実装力・解読力からは逃れられない!! ⚫「エンジニア」を名乗る上で避けて通れないのが「実装力」とそれを補 助する「解読力」 ⚫プログラムを“”書く“”ということ“”読む“”ということ ->先ほど申し上 げた問題解決に直結する所作 優先順位とその活かし方 ⚫まず優先なのは“”読む“”ということ ->読むことで知識をつける

    ⚫次に””書く””ということ->書くことによってそれを活かすことができる ◼まず読めるようにならないといけない(書きながら覚えていく 流派のやり方もあるらしいが..? by xryuseix) 2022/6/15 Ritsumeikan Security Team 17
  18. 読む目的とその手順 読む目的 ⚫OSSのライブラリを用いるときなどしょっちゅうドキュメントを読んだ り様々な場面でソースコードを”読む”という場面に遭遇する ⚫適切な場所を切り出して技術適応(応用)する必要性 読む手順 ⚫1.実行対象の認識と実行ファイルの実行 ⚫2.解析で読むファイルの決定(プログラムの構造を知る・ディレクトリの 概念を知り探索し問題のあるファイルを突き止める) ⚫3.改良点の技術適応

    抜き出して考察などといったソースコード解析を 行う 解析の流れの一例::表層解析->実行 & 動的解析->静的解析(Ghidraなど のリバースエンジニアリングツールを用いたmainエントリの解析) ⚫4.デバッグ!!デバッグ!!デバッグ!! 2022/6/15 Ritsumeikan Security Team 18
  19. 解析の手法とジャンル Offensive Security ⚫静的解析と呼ばれる (x64_dbg, IDA, Ghidraなどを使う) ⚫一般的にパートにわける->パーツ解析->挙動把握 & 変更の流れを踏む

    ⚫デバッグを用いる手法で変数の挙動を適宜確認しながら手を動かす ⚫静的解析の応用にはバイナリエクスプロイトや脆弱性の発見の自動化な どがある Defensive Security ⚫動的解析と呼ばれる (Wireshark, API Monitorなどを使う) ⚫手動による逐次プロセスの考究を要求し変数の挙動は完全に予測に基づ いた観測点に立つ ⚫動的解析の応用にはデジタルフォレンジックによるアーティファクトの 収集などがある 二面性を持って解析の要が出来上がってくる 2022/6/15 Ritsumeikan Security Team 19
  20. デバッグ 任意の観測点からソースコードを見る ⚫実行ファイルの実行 ⚫解析スタート デバッガの利用 ⚫VSCなど自分の統合開発環境依存のデバッグツールの利用->コードに手 を加えることなく必要な情報を得る デバッガを利用しない ⚫printf デバッグ(printfの挿入)

    ⚫Consoleの標準関数チェック場所への任意の挿入実験(web) ⚫これらはコードを改変することによって実現される 2022/6/15 Ritsumeikan Security Team 20
  21. 表層解析 はじめにやってみよう ⚫実行はせずにファイルそのものから読み取ることができる情報を元に解 析する手法 (Virus Totalなどよく使われるツールもある) ⚫そのとき、ハッシュ値やメタな情報やプログラムに含まれている文字列 情報の一部を切り取ったりしたものをもとに解析している 何が取得できる???? ⚫ファイルシステムなど基本情報が手に入る

    ->解析の方針を立ててその時 間を短縮することに使える ⚫しかし、限定的な情報しか手には入らない そのために動的解析や静的解析をしてやる必要がある 2022/6/15 Ritsumeikan Security Team 21
  22. 動的解析 逐次プロセスによる考究の要求 ⚫実際にファイルを実行してその実行結果から変数の挙動を読み取る手法 ⚫実行時に発生したファイル、通信、レジストリの情報などを材料として 調査をする どんなメリット・デメリットがある????? ⚫動作を元に確認するので動作の枠の中での解析となって短時間で解析の 結論が出る ⚫特定の条件下では動かないケースがある 最終的には静的解析をちまちまやっていかないと完了しない解析

    ファイルが存在 ⚫マルウェア解析までを視野に入れる静的解析ではx86_64アーキテク チャ、Assembly, CやC++のプログラム読解力、WindowsやLinuxの OSの内部情報、マルウェア解析としての手法、Ghidraなどのリバース エンジニアリングツールの使いこなし..など異常に幅広くそして深い技術 で殴っていく必要がある ⚫ゆっくりでいいから時間をかけて解析->理解していこう 2022/6/15 Ritsumeikan Security Team 22
  23. 静的解析(step1:パートに分けるまで) プログラム->処理の流れ ⚫大きなソースコードを読むときは抽象と具体、論理的思考を意識する ⚫ソースコード内部の全部の要素を確認して道筋を立てて大きな処理の流 れを把握する ⚫コメント文を参考にして予測したり必要に応じて動的解析をしながら次 の予測を立てる ⚫コメントを残すことが非常に重要である。この関数は何をする関数?こ の変数はどんな役割を持っている?変数群の管理は?管理元と適応先は 正しい?などをはっきりさせることが解析において極めて有効である

    ⚫処理の流れを確認したら処理をまとめてパート分けする。その際リバー スエンジニアリングツールなど効率よく使おう 2022/6/15 Ritsumeikan Security Team 23
  24. 静的解析(part2:パーツ内の解析) 任意のパーツを絞り出したあと ⚫関数や変数の役割を予測したり動かしてみて挙動を確認する(逐一、動的 解析することが次の静的解析の手法の発想を生む) ここで2つの枝分かれ ⚫1.原因追求をしていくパターン 開発の場合は区切ったパーツで変更すべき機構とか変数の処理に誤りがあ 流と思うのでそれをどのように修正したらいいのかを考える。 CTF ,

    脆弱性調査の場合は“どの部分の機構が脆弱なのか“をはっきりさせる ⚫2.新しい解決策を生み出さないといけないパターン どのように変更するか、また新しくどのような処理を挿入するかについて 考えていく必要性が生じる 2022/6/15 Ritsumeikan Security Team 24
  25. 静的解析(part3:挙動把握・変更) 1,2のパターンがわかったその先 ⚫1であれば開発者の場合:不適切なコードを修正しバグを消す(セキュリ ティーを強化するとも言える) ⚫1であれば攻撃者の場合:APIやメモリ番地など攻撃に必要な情報を追跡 し整理する ->Exploit Codeをかく ⚫2であれば開発者は適切なコードを追加し全体の挙動の整合性を取る ここまでのまとめ

    ⚫動作や処理の予測 実際に動かした時の確認 が重要 ⚫大は小を兼ねるがその大は小で構成されていることを知る 2022/6/15 Ritsumeikan Security Team 25
  26. コラム::可読性の高いコードを目指して 可読性の大別 ⚫1.他人が読んで最短時間で解釈可能なソースコードの記述 ⚫2.論理の指し示しの表記とそれがわかる処理系の流れ 意識したいことは山ほどある!!!!!! ⚫命名法 (汎用名->適材適所な場所での利用と理由の記述) ⚫演算子の選択 (例:ifの条件分岐の時など) ⚫インデント

    (VSCなどの拡張機能を入れておきましょう) ⚫コメント文 (すべきときとするべきでない時がある) ⚫ネストは浅くする (制御フローの簡素化) ⚫変数のスコープは小さく 変数は結構読みやすさの核心に直結します ⚫その工夫としての 関数 構造体 クラス 処理のためにあるもの ⚫配列 オブジェクト <- 変数のためにあるもの ⚫ファイル分け (巨大な式の分割) ⚫ライブラリの有効活用 参考文献::リーダブルコード 2022/6/15 Ritsumeikan Security Team 26
  27. ようやく本題!!! 言語習得の手順 ⚫目視で確認できる記述手法を知る。情景から掴める雰囲気があるはずだ ⚫基本の言語骨格についてドキュメントを読んで理解する ⚫ドキュメントにあるサンプルコードを解析したりサンプルを元に独自で コードを作成して手元で動かす エラーが出ました/おめでとうございます/全てが始まりました ⚫最初やりたての言語に慣れないうちはなれないエラー文に手こずる場面 も多いと思う ⚫そんなとき今まで見てきた”解析思考”が役に立つ!!!!

    ⚫解析->問題の発見->”手動”から導く解の検討->解の発見->手法の整理 ->可読性を意識してコードの再記述&&デバッグ!! の繰り返し 結局重要なことって何だったの? ⚫エラー処理?????->違う ⚫コードを書いた結果自分の意図したことが実現できたかどうか 2022/6/15 Ritsumeikan Security Team 27
  28. 基本所作の繰り返しの先にあるもの 繰り返される「知識->分野->技術」 ⚫基本の知識を身につけコードを書きコードを解析する所作 ⚫プログラミングは知識からなった1つの体系的分野である ⚫分野に挑む<-たくさんの知識が必要で大変だし、ましてや出来上がるな んてことはない ⚫とりあえずコードを書いてみよう!!エラーを出そう!! ⚫そこで次の解決に必要なのが解析思考!!!! ⚫動的解析によるデバッグなど解析経験によって自分のバックグラウンド に経験の蓄積が起こる->その蓄積が次プログラムを書くときに“予測力”

    を育んでくれる、これの地道な積み重ねが上級者になる道 ⚫自分で設定した課題解決のための予測を立て自分が意図するコードを書 き解析をし確認をし言語習得の道が開かれる 以上が本質理解への最も洗練された言語習得への道なのではない かと私は考えています.. 2022/6/15 Ritsumeikan Security Team 28
  29. まとめ 独学モデルを実例に落とし込む具体的な方法についてみた ⚫あらゆる勉強にいかせるようにやることに対して自分の型を作ろう ⚫なんとなくやらない ⚫開発においても動かすし考える。その両面を意識 CTFをやろう!! ⚫ここまでの総論と各論を実戦の場で活かしましょう。そうCTF ⚫解析系-> Pwn, Binary

    Exploitとかをやってみましょう ⚫難しかったら…?手を止めてもいいです。その代わりにプログラムを書い てみましょう。プログラムを書くことも解析への第一歩です ◼やってみましょう 手を動かしてみましょう 2022/6/15 Ritsumeikan Security Team 29