2021年12月31日金曜日

2021年を振り返って

こんにちは、みれんくです。

今年はいろいろあり、まとめておいた方が振り返りやすくてGOODではと思い、大晦日の15:22から書いています(遅い)。

来年はめんどくさがりと見通しの甘さを克服したいです。

1月

当時のツイート群

5iiのROMやカーネルを弄ったり、金を使う生活を行ったりしてたっぽいです。

ツイートはしてないけどごちうさ三期も終わり、労働(飲食店のバイトです)も激化していて、本格的にやめることを考え始めていました。

てか確認したら今と比べてえげつないタスクをこなしていてビビる(土日は労働により潰れる、平日夜もランダムでシフトが入る中課題をこなしながら趣味もやってる)、お前本当に俺…?

2月

当時のツイート群

この月は何回か研究室に顔を出し、PCの環境構築等を行っていました。 

また、他のことでは引き続き5iiを弄ったり、スキルアップのためにPwn本読んだりリンカローダの本読んだりしてました。春休み入ったからってえらすぎる…

また、この月で労働をやめる決意をし、その旨を伝えました。吹雪の中散歩して将来のこととか整理しながらこれからのムーブを練ったことを今でも覚えています。多分ヤバかったと思う。

3月

当時のツイート群

呪!オンゲキプラチナレート達成!

祝!ボルテ魔騎士達成!

オンゲキR.E.D.が終わる前にとあわてて取りました。ゲーセン帰りに友人を見逃すくらいには呪っていました。達成時に疲れからかRakuten miniを落として割ってしまうこともしました。多分ヤバかったと思う。

ボルテはいままでの壁が嘘のように達成しました。ここら辺から音ゲーにどぶってますね。

また、今までドライバモジュールをモジュールじゃなくすると起動しなかった5iiのカーネルが起動し、LTO/CFIも解決して、今のchinomofu_kernel_edoができたのもこの月です。アプデしないとですね…

4月

当時のツイート群

呪!オンゲキごちうさランイベ55位

ウン万溶かしました。

ちなみにこの月の労働は12連勤などしました。

5月

当時のツイート群

2年働いていた労働をやめ、無職になりました。

また、研究の方針も固まりはじめ、ちょこちょこコードを書き始めました(のちに全没にします)。Web系技術のことはさっぱりわからんだったので教科書を借りてサンプルを実際に手を動かし作る等から始めました。一年を通して、このときよりかは知見が深まっていると感じます。

あと、CTF4bにも参加しました。特に成績が良かったなどはありませんでしたが、以前と比べてWeb問に対応できたのと、Heap問がもう少しで解けそうだったのが印象に残っています。

6月

当時のツイート群

音ゲーやってたくらいですかね…

一応何かしないとという危機感はあったっぽいです。そこから動けないのは課題ですね。

7月

当時のツイート群

形式上の大学院入試(面接のみ)がありました。先輩方は別に難しいことはないとおっしゃっていたので前日にカンペ作って臨みましたが、ひどい有様でした。次面接あるっていうときには入念な準備が必要だなと感じました…

また、8月の学会発表(軽いもの)への準備をやっていました。

8月

当時のツイート群

祝!ボルテ剛力羅達成!

BoF回に合格しました。

また、この月は学会発表、数日のインターンがありました。どちらも軽いものとはいえ、両立していたのでえらいと思います。

あと、この月に今まで作っていたシステムを全破壊し、一から作り直しました。以下の本が構築し直す際、考え方の整理によかったです。誤字等が目立つのが少し残念ですが…

9月

当時のツイート群

オンゲキの虹レートを目指し始めました。 

また、こっそりセキュリティ・ミニキャンプに申し込みました。この行動のおかげでいろんな人に出会えたり、知見が広がったので今年一番のムーブといってもいいかもしれません。

ミニキャンプの記事は別記事でまとめましたので、興味があればご覧ください。

10月

当時のツイート群

呪!オンゲキ達成!

また、ミニキャンプが始まりました。陰キャなので最初の方はびくびく受けてました。

11月

当時のツイート群

12月

当時のツイート群

まとめ

振り返ると後半のだらけ具合がすごいことを認識したので、来年は技術と研究にもう少し熱を注ぎたいです。

来年もどうぞよろしくお願いいたします。



セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編5:コンテナとその実行基盤を取り巻くセキュリティの基礎と実践~

ミニキャンプオンライン2021「ファイルシステムについて仕組みを知ろう」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

コンテナとその実行基盤を取り巻くセキュリティの基礎と実践

コンテナオーケストレーションの基礎と、それのセキュリティ対策についての演習を行った講義でした。

コンテナを利用する際の対策を学んだとともに、本講義で初めてKubernetesを利用し、便利で楽しそうなため自分でも何か使ってみたいなと思いました。

しかし、コンテナオーケストレーションが有効なのはノードがたくさんある場合なので、そんなお金はないからしばらくはないかな~って感じです…誰か俺にスパチャしてくれ

募集課題

コンテナ型仮想化技術やコンテナオーケストレーションツールがシステム構築・運用に与えた影響と、それらの環境において懸念されるセキュリティ上の脅威を一つ取り上げて、その原因や影響、対策等について論じるといった問題です。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題5にあたります。

自分はこの課題を提出していませんが、書いていたとしたら

  • コンテナ型仮想化技術の利点として、OSにソフトウェアを直接インストールするより、ソフトウェア間の依存関係を保つことが容易なため、構築が行いやすい。
  • コンテナオーケストレーションツールによって、システム構築後のスケーリングや冗長化が簡単になった
  • 利用するコンテナイメージに悪意のあるコードが含まれている可能性がある。対策としては公式が提供するもののみを利用することがあげられる

らへんをまとめていたと思います。

募集時にはセキュリティ上の脅威はこれとコンテナブレイクアウトくらいしか知りませんでしたが、のちの講義(3章が当たります)を受け、思っていたよりコンテナの扱いには気を遣う必要があるのだなと感じました。

事前課題 

Docker、Kubernetes、Open Policy Agent/Regoについての基礎知識をつけるため、実際にコマンドを打って動作を確認したり、ポリシーを記述したりしました。自分は卒業研究の方でDocker、Docker Composeを利用していたため、DockerとKubernetesは扱いやすかったです。

Rego言語についてですが、ポリシーの記述用なので順次実行とは違った考えが必要なところが少し難しかったです(以下の講義スライド78ページなど)。また、公式ドキュメント(https://www.openpolicyagent.org/docs/latest/)も充実しており、テスト用にPlayground(https://play.openpolicyagent.org/)もあるので、実際に定義を行うときはこれらを利用すればなんとかなりそうだとも思いました。

講義

こちらの講義は資料が上がっているため、是非確認してみてください。

初めにコンテナ型仮想化やコンテナオーケストレーションの基礎を学び、後半ではTrivyを使ってコンテナイメージに含まれる脆弱性を調べてそれへの対応を考えたり、ポリシー定義をしてデプロイ前に防がれるのを確認する実習をしました。今回はTrivyの実習について書こうと思います。

Trivyの実習

講義資料の76ページが該当します。資料の通りコンテナの脆弱性を見つけるだけでなく、「対応方法」を考える必要がありました。以下が自分の書いた内容となっています。

ここで重要だったのが、Trivyで脆弱性を調査すると重大な脆弱性が複数表示されたりしますが、「コンテナの利用法」を考えて対応を考えることです。自分が見つけた脆弱性もそうですが、コンテナをMySQLとしてのみ使えば脅威は低いです。この実習で行った脆弱性の調査でも「サイバー攻撃対応入門」のIDSアラートを調査した際と同じような「経験や慣れ」が必要そうと思いました。

また、脆弱性をなくすにはバージョンを上げる等の対応が考えられますが、開発側の事情で更新が難しいといったこともあります。したがって、いろんな事情を考慮した対応方法を考えることが大事だと学びました。

修了試験

仕様に沿うGateKeeper用のポリシーを記述するという問題でした。仕様が

  • 検査対象のマニフェストはPod
  • Podに含まれるコンテナのイメージの指定においてダイジェスト(SHA-256ハッシュ値)が利用されていない場合にリクエストを拒否
  • ダイジェストに対応するイメージが存在するかは問わないが、SHA-256の書式には則っていなければならない

というものです。

自分はこの問題に取り組む時間がありませんでした…最後には大ヒントが出ていて、「ダイジェストを判定する正規表現を書け」という問題になっていたため、ちょっと後悔が残りました。

まず、正規表現以外のポリシーについて考えると、講義資料83、84ページを参考にすることで


package example
violation[{"msg": msg}] {
  c := input.review.object.spec.containers[_]
  # ここで正規表現を使い判定
  msg := "ダイジェストが利用されていないコンテナイメージがあります"
}
  

と書くことができます。イメージ名は「input.review.object.spec.containers[_].image」で参照できるため、c.imageでイメージ名を調べることができます。

Regoでの正規表現は「re_match」関数で行え、マッチした際にtrueを返すので、SHA-256の書式にマッチする正規表現を書き、NOTを取れば答えとなります。

肝心の正規表現ですが、イメージ名が

  • イメージ名のみ
  • タグ付き(<イメージ名>:<タグ名>)
  • SHA-256ハッシュ値(<イメージ名>@sha256:<ハッシュ値>)

のいずれかを取り、下のみを通すものを作らなければなりません。

イメージ名は1文字以上の任意の文字を取るので、「.+」で表せます。

ハッシュ値は256ビットの値=64桁の16進数で表されるため、[a-f0-9]{64}で表されます。

したがって、これらを組み合わせた

.+@sha256:[a-f0-9]{64}

が答えとなります。ポリシーは


package example
violation[{"msg": msg}] {
  c := input.review.object.spec.containers[_]
  # ここで正規表現を使い判定
  not re_match(".+@sha256:[a-f0-9]{64}", c.image)
  msg := "ダイジェストが利用されていないコンテナイメージがあります"
}
  

となります。

ここまで解いて、大ヒント出てから取り掛かれば間に合ったかもな…と思いました。時間配分等も考えられるようにならないとですね。おしまい。



セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編4:Linuxシステムプログラミング入門:コンテナ技術を支える名前空間~

ミニキャンプオンライン2021「サイバー攻撃対応 入門」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

Linuxシステムプログラミング入門:コンテナ技術を支える名前空間

Linuxのシステムコールを駆使して、ミニコンテナを自作する講義でした。

個人的にこの講義が一番楽しみでした。理由としてMagisk(Androidのroot化するやつです)で名前空間が利用されていて、他のアプリからrootを隠せた(今はありません)んですけど、これの仕組みをちゃんと学びたかったというのがあります。

一時は個人で調べて情報を見つけられませんでしたが、本講義のお陰で学ぶことが出来ました。また、システムコールをあれこれするのも楽しかったので、個人的に遊んだり、泥開発に活かせないかな〜と考えております。

また、こちらの講義関連物は以下で公開されているため、ぜひ確認してみてください。本当に丁寧に解説されています。そのためぼくがここにかくことがない

https://2021.mc.harro.ws/ 

募集課題

「標準入力から実行ファイルのパスを受け取り、その実行ファイルを実行するのを繰り返す」というプログラムを作成する問題でした。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題4にあたります。

自分はexeclp()関数とfork()関数を利用し作成しました。作成したコードは以下です。

躓いた点としては、初めに軽く調べて動作はしてくれるプログラムができたのですが、waitpid()の箇所が適切ではなく、プロセスが大量生成されてしまうということがありました。

事前課題 

一番初めに記述したページの「事前課題」が当たります。ここでは、演習課題について書いていこうと思います。

#4.2 演習:LinuxでのC言語の基礎

実際に提出したコードが以下です。

 講評では、「正しく動くコードだけど、tmpstrの型がちょっとよくない」(意訳)とのコメントを頂きました。この時はポインタのconstの扱いがわからなかったので…

 ポインタのconstの扱いは、文字列ポインタを例にすると

  • const char*:ポインタが指すデータ変更不可、ポインタ変更可
  • char* const:ポインタが指すデータ変更可、ポインタ変更不可
  • const char* const:ポインタが指すデータも、ポインタも変更不可 

となっているのが調べて分かりました。したがって、tmpstrはconst char*型にするのがよさそうです。 


#4 演習:ファイルを実行してその結果を取得する関数

実際に提出したコードが以下です。

こちらの講評は「waitpid()関数の使い方を自力で調べ、read()前にstatusをチェックしているところがいいね!dup2は子プロセスでやるといいかもね」(意訳&うろ覚え)と頂きました。

waitpid()はhttps://linuxjm.osdn.jp/html/LDP_man-pages/man2/wait.2.htmlを参考にしました。

dup2についてなのですが、このコードを書く前にDiscordで「複数の値を渡したいなら構造体を使うといい」的な話がされており、ということは「作問時に構造体の利用を考慮していおらず、使わないやり方が存在する…?」と謎の考察をしてこのコードに至りました。

動きとしては、 63行目で標準出力のディスクリプタを複製します。次に、64行目で標準出力のディスクリプタをパイプに置き換え、その後子プロセス実行を行います。clone()が実行された後、親プロセスは70行目に進むため、標準出力を63行目で複製したディスクリプタに置き換えます。複製されたディスクリプタは複製前と同じファイルにアクセスできるので、結果的に標準出力が元に戻るということです。

講義の繋がりを考えると構造体を使って子プロセスにパイプを渡し、子プロセスのみ標準出力を書き換えた方が良かったです。参考にしないでください。

講義

実際にミニコンテナを作成しました。事前課題で作成したprint_string()関数はUIDマップの書き出し、execute_binary()関数はそのまま実行ファイルの実行に利用しました。この講義は他の講義に比べ、より課題と講義が繋がっており、「これがあの課題の伏線回収か…」と気持ちよかったです。

しかし、即興でコードを書くことに慣れていなかった私は、指定された時間に演習を完了できなかった場所がありました。これを通して、この演習以外でも競プロやCTFで重要となるであろう「即興コーディング力」は鍛えないとなと感じました。

修了試験

問題サーバにログインし、フラグを探すという問題でした。なお、スクショは後撮りです。

当時書いたコードは直接競技サーバで作業していましたし、残っていたとしてもフラグ取るためだけの汚いコードなので、今回はどんな作業をしたかのみ記録します。

この問題は一番初めに解き始めました。一番最初に公開されたので…

ログインをするとREADMEがあり、それによると「/try_running_meを実行してね、unshareでググるといいかも」とのこと。

とりあえず権限の確認と、実行を行ってみると

とのことで、実行権限しかなく、お家芸であるstringsコマンドで調べることができないため、素直に従うことにしました。かなしいね。

シェルで実行している限り、第0引数は自身の実行パス(/try_running_me)が入ってしまうため、講義で扱ったexecve()関数の引数を変えたプログラムを書けばいいのだなと思いつきました。

しかしリモート環境でコード書けるのか…?それともunshareというものを理解しないとなのか…?と恐る恐るnanoとシェルに打ち込んでみたらあっさり立ちあがりました。 よかった。

また、ここで自分は空文字列ではなくNULLを渡すものと勘違いしてしまいちょっと躓きました。文章を読め。

あとはコンパイルして実行、フラグくるか!?と思ったら


はい。

とのことで、ここでunshareかな?と思い調べました。しかし、自分はunshareを「Cのコード内で使う」という固定概念で調べていました。したがって「よく分からないし時間ないし修了試験CTF中にあたらしいことやる?」となり、「fakerootになればいいんだろうから、UIDマップ書いてあげる講義のコード使いまわせばいいじゃん」とunshareの謎を残して作業しました。

そして後者の方針で無事フラグをゲットしましたが、

  • unshare使ってないがこれでよかったのか…?(別解として想定済み)
  • 想定外解答でリモートサーバ壊したりしてないよな…?(別解として想定ry)
  • もしや失格…?(別解としてry)
と不安になりながら終わりました。

 

その後、解説にて「unshare"コマンド"を使うと簡単に解けます」と実演され、"コマンド"かあ~となったのと、めっちゃ簡単に解けちゃうじゃん…となりました。おしまい。



セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編3:サイバー攻撃対応 入門~

ミニキャンプオンライン2021「サイバー攻撃対応 入門」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

サイバー攻撃対応 入門

攻撃者のことから学び、演習で様々なログを追って攻撃シナリオを整理するという講義でした。

講義タイトルでは想像出来なかった面白い内容(ぼくの頭が弱いだけかも)で、一つ一つの証拠から攻撃者の動きが見えたときは気持ちよかったです………

募集課題

pcapファイルが渡され、「人がWebアクセスした際に発生したと考えられる通信のクライアントが使用しているTCPポート番号」を答える問題でした。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題3にあたります。

pcapをWiresharkで開き、HTTPのフィルタをかけたところ、大量のcurlからのGETリクエストが送られているのを観測できました。curlを使い、同様のリクエストを人が送るとは考えづらいため、それ以外のパケットを探しました。

すると、cssやjsの200番が返っているのが見え、その前のGETリクエストを調べたところ、Firefoxからのものが見え、これのポート番号(42400)を解答として出しました。

…と出した当時はこれでええべだったんですけど、最近Discordでこの件が触れられていて、「UAは偽装できるため、その点に触れられているものに加点している」とのことで、無事満点は逃していそうです。俺よく選考通ったな。

また、他の方の解答だと、ポート番号の範囲がLinuxのエフェメラルポートの範囲であるという点とUAがLinuxという点で偽装とは考えづらい、という考察をしていらっしゃる方がいて、とても論理的な解答だ…と感動しました。みんなすごい…

事前課題 

Linuxコマンドを使ったログ解析と、Wiresharkを利用したログ解析を行いました。

前者では主に

  • catコマンド:ファイルを標準出力に出力
  • cutコマンド:区切り文字を指定し、要素を取り出して出力
  • grepコマンド:文字列検索
  • sortコマンド:ソート
  • uniqコマンド:重複している行を削除
  • wcコマンド:行数をカウント 

をパイプで組み合わせて「○○の回数」や「○○のTOP10」を調べるといった課題を行いました。

後者はWiresharkのフィルタや統計機能、TCPストリームなどの基本的な使い方を学べました。

事前課題全体を通して、ログ解析に利用するツールに慣れることができました。

講義

初めに書いた通り、まず初めに攻撃者のことについて学びました。

攻撃者には、そもそも攻撃者が「なぜ」攻撃を行うのかという目的が存在し、その目的を達成するために「いつ、どこで、何を狙うか」という対象があり、最後にその対象に対しての手法が存在します。

サイバー攻撃に対応するためには、手法を知ることが最も重要です。そのため、次に実際にどのような流れで攻撃が行われるかについて学びました。

サイバー攻撃の流れをモデル化したものがいくつか提唱されており、

等があり、今回はUnified Kill Chainに沿って実際にどのようなツールが使われ、どのようなことが行われているかを知りました。 

このモデルでは大きく「初期侵入」「ネットワーク内伝搬」「目的実行」と分かれています。

初期侵入がよくCTF等で触れる部分(?)で、標的の情報収集であったり実際の攻撃を行ってシェル操作をできるようにするといったところを指します。攻撃が成功した後、シェルを操作するためにWeb上で任意のコマンドを実行できるようにWebシェルを置いたり、標的サーバから自前のサーバへコネクションを張って操作できるようにするリバースシェルという方法があることを知りました。

初期侵入が成功した後は内部の探索や認証情報窃取、他のシステムへの水平移動が行われてしまうとのことです。その後は目的実行と移り、情報収集が行われ持ち出されてしまいます。

サイバー攻撃を防ぐにはいかに初期侵入を防ぐことが大事と感じたとともに、万が一攻撃を受けてしまったらネットワークからの切り離し等の迅速な対応が必要だなとより感じました。

その後、様々なログ等から攻撃者がどのような動きをしたのかを時系列で整理するといったことをしました。演習の詳細を書きたいところですが、事情により内容公開がNGなので、扱ったことのみ書きます。問題があったら消えます…

扱ったのはIDSアラートログ、SSHイベントログ、Webアクセスログの3種類のログファイルと、パケットキャプチャファイル、ディスクイメージです。ログで大まかな攻撃者の行動を掴み、残り二つで詳細な調査を行いました。

IDSアラートではSuricataのアラート管理ツールのEveboxを使用しました。フィルタやソート等が直感的に扱えて便利でしたが、IDSのアラートは先ほど説明した「標的の情報収集」での通信でも上がってしまうのと、危険度が低いと表示されていても、実際には攻撃が成功してしまっていることもあったため、ここの調査は経験と慣れが必要そうだと感じました。

SSHとWebアクセスのログ調査では、事前課題でやったことがそのまま生きたため進めやすかったです。

修了試験

pcapファイルが渡され、その中からフラグを探す問題でした。最初はこれだけ与えられてノーヒントでした。"ミニ"キャンプ?

その後、ヒントとして

  • どのWebアプリが攻撃されているかを調べてみようね、一番最初のHTTP通信でわかるよ
  • 文字列のデコードはCyberChef(https://gchq.github.io/CyberChef/)が便利だよ

と頂きました。

自分はこの問題をこのヒントが出てから解き始めました。そのためあまり詰まることなく解くことができました。

実際に問題のpcapファイルを開き、一番最初の通信を見ると

とのことで、Drupalの7.54が使われていることがわかります。

そこで、このソフトウェアの脆弱性について調べると、CVE-2018-7600というリモートからの任意コード実行の脆弱性があることが分かりました。したがってその後のパケットに攻撃コードがありそうということで探索を再開しました。

Drupalを知らないため詳しいことは言えませんが、PoCコードによると、パスワードリセットフォームをよろしくないものにして、Ajaxのファイルアップロードでコマンドが実行されてしまうらしいです。当時はそこまで調べる余裕がなく、怪しいパケットを人力で見つけました。

怪しいパケットのコマンドを見ると、

となっていて、base64でcreate.phpの中身が記述されていそうなことがわかりました。

実際にデコードすると、


 と、受け付けた文字列をROT13→base64の順で戻して実行しているようです。なのでここでcreate.phpのPOSTをCyberChefで戻して調べ始めました。

すると…



と、暗号化されたflag.txtが192.168.180.163の1337ポートを利用して送信されていることがわかりました。正直もうここでフラグ出るかな~って思っていたので凝ってるなと思いました。"ミニ"キャンプ?

ということであとはWiresharkで「ip.addr==192.168.180.163 && tcp.port==1337」とフィルタし、追跡→TCPストリームで内容をflag.encと保存、それを復号化で…

無事修了できました。やったね。


セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編2:マルウェアのトラフィックを分析・検知してみよう~

ミニキャンプオンライン2021「マルウェアのトラフィックを分析・検知してみよう」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

マルウェアのトラフィックを分析・検知してみよう

マルウェア検知システム(IDS)の中で、今回はネットワーク型(NIDS)を取り扱った講義でした。こちらも事前課題はありませんでした。

自分はこの分野はほぼ触ったことが無く、0からのスタートでしたが、事前知識も説明して頂けたお陰で無事進めることが出来ました。また、機械学習を利用した検知という現代な対応も知れて良い講義でした。

募集課題

配布されたpcapファイルをフロー形式に変換し、

  •  パケット数、フロー数などのエントリ数
  • 変化があった場合、その条件
  • フローの観測時間とエントリの出力順
  • L3プロトコル(UDP/TCP)による出力の違い
  • その他気づいたこと

 について考察するという問題でした。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題2にあたります。

自分は応募時、この問題は選択しませんでしたが、修了後に軽く解いてみたのを以下に記述します。

Zeekのインストール

Zeek(https://zeek.org/)はLinux環境でしか動かないようなので、その環境を用意してください。自分はWSL2のUbuntu 20.04を利用しました。

その後、好きな方法でインストールしていいのですが、aptでインストールした場合だと/opt/zeek/binにパスを通してくれないため、手動で行う必要がありました。

Binary Packages(https://github.com/zeek/zeek/wiki/Binary-Packages)のページをみると恐らく他のインストール方法でも同様だと思われます。ご注意ください。

フロー形式への変換

pcapがあるディレクトリに移り、

zeek -r <pcapファイル>

と実行することで変換できます。ディレクトリのconn.logが当たります。

考察

パケット数、フロー数などのエントリ数

まず、変換したところフローのエントリは6つになりました。パケット数は送り元からのパケットが合計13、送り先からのパケットが10、合計23となりました。pcapファイルをそのままWiresharkで開いても23なので正しく変換されていると考えられます。

エントリ数がパケット数よりフロー数で減ったのは、TCPの3ウェイハンドシェイクがまとめられたためだと考えられます。(参考:https://docs.zeek.org/en/master/logs/conn.html)

フローの観測時間とエントリの出力順

自分が変換したものでは一部時系列に並んでいませんでした。この理由としては、時系列では「DNSの通信→UDP送信→TCP通信」となっているのですが、一度RSTが返ってきてしまっていて、TCP通信が後にまとまっているために時系列がズレてしまったと考えます。正直わかんないです…

L3プロトコル(UDP/TCP)による出力の違い

historyフィールドでUDPだとD、TCPだとSが先頭に来るのに気が付きました。これの理由はDは送り元からのデータパケットを指していて、Sが送り元のSYNパケットを指しているからだとわかりました。


全体を通して、この募集課題を行っていれば、Zeekのフィールドについて理解が深まり、講義で行った機械学習の演習に役立ったな…ってなりました。

講義

講義は大きく

  • マルウェアトラフィック検知の事前知識
  • Snortを使った演習
  • 機械学習を利用した検知
の 3つのセクションに分かれていました。

マルウェアトラフィック検知の事前知識

まず、マルウェア「ユーザやシステム」に対して意図しない動作を行うコードやソフトウェアを指していて、「トロイの木馬」、「ボット」、「ワーム」といったタイプによる分類、「DDoS」や「ポートスキャン」といった動作による分類、利用する権限等で分類することができます。

マルウェア検知システムは検知方法検知場所で分類することができます。

検知方法には、定義ファイルなどのルールに一致するかで検知するシグネチャベース、大量の良性活動と悪性活動からルールを学習し検知する機械学習ベースなどで分類が行えます。

検知場所は、PC等の端末で動き、プロセス情報等を利用して検知するホスト型、ネットワークの中間に設置し、トラフィックパターンを利用して検知するネットワーク型で分類が行えます。

今回利用したSnortはシグネチャベースの検知を行うネットワーク型のシステムとなっており、後半ではネットワーク型のシステムで機械学習ベースの検知を行う実習を行いました。

Snortを使った演習

今回は実際にルールを記述し、アラートが上がることを確認しました。

Snortのルールは

alert icmp any -> 192.168.1.xxx any (msg: "ICMP detected"; sid: 10001)

のように記述し、/etc/snort/rules以下に保存します。構造は

<action> <protocol> <送信元IP> <ポート番号> -> <宛先IP> <ポート番号> (options)

となっています。

actionには

  • alert:アラート出力、パケット内容記録
  • log:パケット内容記録
  • pass:パケット通過
  • activate:アラート出力、dynamicの処理実行
  • dynamic:指定された処理を実行
を指定することができ、protocolは
  • tcp
  • udp
  • icmp
  • ip

を指定することができます。

optionsでは

  • msg:指定された文字列をアラートまたはログに出力。"(ダブルクォート)でくくる
  • flags:TCP制御フラグ。F(FIN)、S(SIN)、R(RST)、P(PSH)、A(ACK)、U(URG)で指定
  • sid:シグネチャID。99以下は予約。100-999,999は配布ルール用。1,000,000以上はユーザが定義できるルール

を指定できます。

したがって、ルールの例で示したものであれば

「192.168.1.xxx宛てのすべてのICMPパケットを受信したら"ICMP_detected"とアラートを出しパケットを記録する」

というルールとなっています。

alertファイルは/var/log/snort/alert以下に存在しcat等で見ることができ、logファイルは/var/log/snort/log以下に存在しtcpdumpで見ることができます。

機械学習を利用した検知

前節でSnortを利用した検知を説明しましたが、デメリットとして「未知の攻撃(悪性活動)に対応できない」というものがあげられます。そこで既知の悪性活動と良性活動データを機械学習にかけることでそのデメリットを補うことができます。

学習に利用する活動データは事前課題で扱ったようにZeekでフロー形式にして利用します。

ミニキャンプではその後フィールドや機械学習アルゴリズム等を変換し、評価・考察を行いました。

この際、自分は深く考えず「コネクション継続時間」や「データサイズ」で学習を回してしまったのですが、学習が終わらないまま実習時間が過ぎてしまいました。終わった後に

の気づきを得ました。頭が弱い。

修了試験

修了試験は「示されたSnort定義ルールに反応するパケットを送信する」という問題になっており、そのルールが

alert udp any -> <競技サーバIP> <ポート> (content: "What is flag?";)

のようなものでした(記憶を辿ったものであり、細かい部分が違うかもです)。

パケット送信にはnetcatを利用し

$ netcat -u <競技サーバIP> <ポート>

->What is flag?

と入力することでフラグを得ることができました、やったね。



セキュリティ・ミニキャンプオンライン2021 参加記 ~内容編1:ファイルシステムについて仕組みを知ろう~

ミニキャンプオンライン2021「ファイルシステムについて仕組みを知ろう」の募集課題、事前課題、講義、修了試験についての記事です。

他講義リンク

 

ファイルシステムについて仕組みを知ろう

FAT32ファイルシステムのデータ構造についての講義でした。事前課題はありませんでした。

普段意識しないファイルシステムの構造を触れ、作った人はやっぱり賢いな〜という気持ちや、削除されたファイルにちゃんとアクセス出来たときは達成感がありました……

一年前(5iiのユメ)の伏線回収。

募集課題

USBメモリダンプの一部を渡され、削除された可能性のあるファイルの名前を答える問題でした。ミニキャンプオンライン概要ページ(https://www.security-camp.or.jp/minicamp/online2021.html)募集要項の問題1にあたります。

自分はhttp://elm-chan.org/docs/fat.htmlを参考に解きました。

ファイルの削除はSFNエントリのDIR_Name[0]に0xE5をセットするとのことなので、0x1fc520のファイルが削除されたことがわかりました。0x1fc500がLFNエントリと考えられ、sec.txtが削除されたと考えられます。(この記事執筆してるときに、提出物のアドレスが間違ってることに気づきました…)

また、自分は

「0x1fc53aから2バイトがファイルの実体の先頭を指すクラスタ番号のため、7番目のクラスタを調べると復元できる可能性がある」

とドヤ顔で書いて提出しましたが、間違っています。

クラスタ番号はDIR_FstClusHi(オフセット0x14、クラスタ番号の上位16bitを格納)とDIR_FstClusLo(オフセット0x1A、クラスタ番号の下位16bitを格納)と分かれており、今回はDIR_FstClusHiが0(課題の0x1fc534から2byte)だったため7番目というのは合っているのですが、説明として不適切です。二度とドヤ顔しません。

講義

初めにデジタルフォレンジックで行うこと、その時使うツールなどについて学び、その次に募集課題で行ったディレクトリエントリ構造体を手動で読み、最後にファイルへのアクセスを行いました。

ファイルへのアクセス

ファイルへのアクセスを行うには

  1. 1クラスタのサイズ
  2. 第2クラスタのディスク上の位置
  3. アクセスしたいデータのクラスタ番号
  4. FATテーブルの割り当て状況

が必要なことがわかりました。1と2はFATのヘッダ、3がディレクトリ構造体、4がブートセクタ等の直後にFATテーブルがあり、そこで確認することができます。今回は修了試験のイメージを使って説明していきます。

1.1クラスタのサイズ

1クラスタのサイズを求めるには、1クラスタが何セクタで構成されているか(BPB_SecPerClus)と1セクタが何バイトなのか(BPB_BytePerSec)を読む必要があります。

この二つの値はFATのヘッダにあり、BPB_ByteSecがオフセット0xBにサイズが2byte、BPB_SecPerClusがオフセット0xDにサイズが1byteで格納されています。

修了試験のイメージで確認すると


となっています。赤がBPB_ByteSec、青がBPB_SecPerClusです。

FATはx86向けに開発されてきたという歴史があるらしく、値はすべてリトルエンディアンで格納されています。

そのため、BPB_ByteSecが0x200=512byte、BPB_SecPerClusが0x08であり、1クラスタ=8セクタ=4096byteであることがわかります。

2.第2クラスタのディスク上の位置

第1クラスタはFATのメタデータ等の領域となっており、上記クラスタサイズに従っていないらしいです。転載許可が出ているため、以下に資料のファイルシステム図を示します。

引用:セキュリティキャンプ

先頭のブートセクタはBPB_ResvdSecCnt(オフセット0xE、2byte)、FATテーブルの個数はBPB_NumFATs(0x10、1byte)、FATテーブルのサイズはBPB_FATSz32(0x24、4byte)で確認することができます。

修了試験のイメージでは

となっていて、赤がBPB_ResvdSecCnt、青がBPB_NumFATs、緑がBPB_FATSz32です。

したがって、BPB_ResvdSecCntが0x20=32セクタ=16,384byte、BPB_NumFATsが0x2=2個、BPB_FATSz32が0x1ff8=8184セクタ=4,190,208byteとなります。

これらより、第2セクタは16,384+4,190,208*2=8,396,800byteから始まっていることがわかります。

3.アクセスしたいデータのクラスタ番号

2.よりディレクトリエントリ構造体を見ることができます。


今回は削除されたPASSWORD.TXTにアクセスするとします。

アクセスに必要なパラメータは募集課題で扱ったDIR_FstClusHi、DIR_FstClusLoとDIR_FileSize(オフセット0x1c、4byte)です。

PASSWORD.TXTのところを詳しく見ると、

となっています。DIR_FstClusHiが赤、DIR_FstClusLoが青、DIR_FileSizeが緑です。

従ってクラスタ番号は0x000018e8=6376番、ファイルサイズが0x00000110=272byteであることがわかります。

4.FATテーブルの割り当て状況

FATテーブルの割り当てを確認する理由は、ファイルサイズが大きい場合に1クラスタに収まらず複数クラスタにわたっていたり、ファイルの断片化で順番通り記録されていない場合があるからです。

2.で示した通り、FATテーブルはブートセクタ等の直後にあります。そして、4byte(FAT32なので)で割り当てが記述してあり、値の意味は

 

引用:セキュリティキャンプ

となっています。今回は6876番のクラスタがどう割当たっているかを調べるため、skipでBPB_ResvdSec(16384byte、この時点でブートセクタがカットされる)+(4byte*6875)=41880を飛ばし、4byte読むことでわかります。

出力が0x0fffffffなのが確認でき、最終ブロックであることがわかりました。

ファイルへアクセス

ファイルのセクタの位置は

第2セクタの位置+((クラスタ番号-2)*BPB_SecPerClus)

で求められ、バイト位置は上記のBPB_BytesPerSec倍になります。

今回は第2セクタが8,396,800byte(16,388セクタ)で始まっていて、読みたいクラスタが((6376-2)*8)=50,992セクタ=26,107,904byteにあるので、合計で34,504,704byteから272byte読めばいいことがわかります。

やったね!

修了試験

FAT32のイメージが与えられ、その中からFlagを探すという問題。

自分は最後の40分程度で取り組みましたが、結果から言うと時間内に解けませんでした。

試したこと

まず、お得意のstringsコマンド+grepコマンドを使い、フラグ形式"mc2021{"を探してみましたが見つからず。

次にマウントしてみると、以下のように3つの画像ファイルと1つのパスワード付きZipファイルが見えました。

 


ここで求め方がパスワードを探し解凍、その中の画像ファイルにフラグがあるのだと理解しました。

その後、講義で習ったディレクトリ構造体を読むと、PASSWORD.TXTが削除されているので、これを見つけに行く旅に出ました。

裏でstringsコマンドを回し、それっぽいのを試しながら必要な情報を集めてました。

…とここでFATテーブルの割り当てを読んでいるところで時間が来てしまいました。

 

解説時「stringsコマンドで見つけられるようなヤワな問題ではないので」と言われ、まんまとひっかかってしまったワタクシでありました。"ミニ"キャンプ?

また、kaitoさんのWriteUp(https://blog.uta8a.net/post/2021-11-20-minicamp-writeup)見たらツール使ってて、その手があったか~~~ってなりました、完敗です。



セキュリティ・ミニキャンプオンライン2021 参加記 ~概要と感想編~

他界隈に他界隈をぶつけるベイブレードが好きなので、智乃さんアイコンで参加してきました。

初体験のレポート、ご期待ください。

なお、この記事の内容はほぼ自分語りなので、内容や技術が知りたいんだよ!って人は以下の別記事をご覧ください。

他講義リンク

 

そもそもそれは何?

 IPAに書いてあるので読んでね(https://www.ipa.go.jp/jinzai/camp/index.html)

 今回は地方大会にあたるセキュリティ・ミニキャンプオンライン2021に参加させて頂きました。募集要項のページはこちらです→(https://www.security-camp.or.jp/minicamp/online2021.html)

おまえは誰?

22歳地方公立大学生4年の独身男性です。運と興味で生きています。智乃さんが好き。

 

 

…真面目なこと書くと、研究でWebアプリの開発をやってて、趣味でAndroid OSやその下のLinuxカーネル、そのまた下のハード弄ったりしてる者です。文字ではつよそうだけど中身みればそうでもないことがわかると思う。

セキュリティ分野はCTFをかじった程度。(CTF4b参加とハリネズミ本、Pwn本読んだ程度)

競プロはABC10週やって頭よくしないとなつって投げてる。灰レート。

詳細な技量等知りたいならば過去ツイでも見てください。端的に書けば表面舐めてるだけの人間です。

参加までの経緯

TwitterのつよつよがTLにちらほらいるのでセキュリティ・キャンプ自体は知っていました。

また、2018年の年末にミニキャンプ in 秋田のお知らせが大学より届き、迷った末に「技量がない自分が参加してもな…技術に"""本気(マジ)"""なこわい人ばっかだろうし…応募課題とかあるし…」という気持ちを「年末だから」という建前に隠し、参加を見送った過去があります。

今回のミニキャンプは例のごとくTwitterで知りました。その時に「オンライン」の文字が見え「これなら場所の問題もないし、こわい人と直接やり取りしなくていいし、なによりバイト辞めて無職なんだからなんかやっか~~~」程度で応募を行いました。なめ腐ってるワネ。

(ちなみにRT元は今回「マルウェアのトラフィックを分析・検知してみよう」講師の小松さんです。前からフォロー頂いていてFFではあったのですが、応募通過してからそのことに気がづいて震えあがってたりします)

内容(応募課題、事前課題、講義)

はじめに書いた通り、別記事でお送りいたします。こっちは比較的真面目に書きました。セキュリティキャンプ知らなかったけど、ここまで読んで気になったって人は是非どうぞ。

全体の感想

どの講義も内容が濃く、知恵の実を食べた気分でした。ぼくの大学だからかはわかりませんが、大学の講義では学べないことを学ぶことができました。量は多く講義だけでは網羅できないですけど、ちゃんと周辺技術のことが書いてあり、講義後にガンガンドンドコ学ぶことができるようになってたりするので、学習の入り口としてとても良かったです。

また雰囲気も良く、Discordでわいわいがやがやしながら講義を受けられましたし、気になったことがあれば気軽に相談が行える環境でした。みんなつよつよは間違ってなかったけどこわくなかった……

ミニキャンプ参加の障壁に「応募課題」や「自分の技量不足」などがあると思います。ぼくはそうだったので。しかし、少しでも興味があるなら早めに参加するべきだと思います。前述した通り、自分は22歳なので来年の全国大会には参加できません。2年前のミニキャンプ in 秋田に参加してたらその次に全国大会…なんてセカイもあったのかなと悔やむばかりです。ぼくの二の舞にならんでくれ。

技術もいっぱい学べたけど、「行動」の大事さも学べました。次は某ICTの某Hack36なんとかとかかな…あとYouTubeに上がってるキャンプの講義動画も見てみて、ネクストもちょっと考えてみようかね…

おまけ

修了試験が2位(5問中3問正解、スコアボードでは4位)だったのでセキュキャンパーカーを手に入れました。やったね。(撮影協力:リゼさん推しの友人)



2021年7月4日日曜日

正のオンゲキ(Lv12+編)

 みなさんこんにちは、みれんくです。

 今回はオンゲキで個人的にやってて楽しいなって思える譜面を紹介します。

 これを書くに至った理由としては…散々言ってるけど楽しいところもあるってことを思い出したいためですかね…

 12+全部開けてるし、絶賛壁ぶち当たって負のオンゲキやってる人間が言う「楽しい譜面」だからそこそこ信頼性はあると思いますよ!!!まあ結局個人差なんですけどね!!!!!

紹介順は追加されたバージョン順となっております。(無印→R.E.D. PLUS)

また、特に記述がないものはMASTER譜面です。

レートも譜面定数も忘れて楽しもうね。それではどうぞ。

 

Link with U

 

Wiki:https://ongeki.gamerch.com/Link%20with%20U

程よい難易度で、ちゃんと譜面を理解しないとノーツが取れない曲。

簡単ではないんだけど、ノーツを取る手が理解できると曲も相まって楽しいです。あとサビのロング拘束で壁出張するところ(動画の1:16あたり)が本当に好きですね。

あと、最初に出てくるおにゃのこがえっちだなあっておもいます

 

Deep-Connect

 


Wiki:https://ongeki.gamerch.com/Deep-Connect

 両手を程よく使う曲。

 全体的にフリックと壁が楽しく配置されていて、オンゲキやってるなあって気持ちになれます。

個人的なここすきポイントは二回目のサビ(動画1:57)あたりからで、このリズムの壁+鍵盤ほんとすき(ボルテもこういうツマミ+鍵盤好きなんすよね、タイムトラベルとかドリームエンド・サバイバーとか)

また、壁拘束させての階段とかレバーでベル取りとかも楽しいレベルで本当に良いです。こういうのでいいんだよ、こういうので(R.E.D. PLUSの12+を見ながら)

あと、最初にでてくるおにゃのこがえっちだなあっておもいます


AstrøNotes.(EXPERT)

 

 

Wiki:https://ongeki.gamerch.com/Astr%C3%B8Notes.

ごちうさイベント時お世話になりました…

まず曲がほんとすきですね。譜面的には動画の0:54あたりの壁とか、程よくてやってて気持ちが良いトリル(動画の1:50あたり)がすきです。

敵レベルも高いですしイベントのお供とかにもおすすめです。

 

Shiny Smily Story

 


Wiki:https://ongeki.gamerch.com/Shiny%20Smily%20Story

譜面デザイン全振りな曲。

僕はホロのオタクではないですが、素人目から見てもこの譜面の凝り具合は凄まじいです。

譜面解説はこちらにある有識者のnoteをご覧ください。

こういう譜面製作者のオタク全開譜面もっと増えてほしい(わがまま)

 

Over Voltage

 

Wiki:https://ongeki.gamerch.com/Over%20Voltage

プラレ上げのとき休憩時にめっちゃやった曲。(スコア取るの難しいため)

サビのロング拘束しながらの鍵盤がそこそこ好きです、難しいけど…

また、1:43あたりからの壁とフリック出張がすきですね、そこで気持ちよくなるためだけに40GP払うのもやむなしだと思います。

トリルは出来ると脳汁でます、がんばろうね、わかりました

あと、最初に出てくる梨緒さんがえっちだなあっておもいます

 

シアワセうさぎ・ぺこみこマリン

 


 Wiki(長いためURL省略)

 R.E.D. PLUSで珍しく譜面で楽しいと思えた曲。

 サビの赤青拘束しての鍵盤→フリックがとても楽しい。しかし、赤BやHIT出やすいので精度合わないときにはおすすめしません。精度度外視したり精度いいときにやりましょう。

あと、譜面外のことですが、イヤホンがないと前奏全く聴こえないので気をつけましょう(1敗) 


おわりに

書き出して、最近オンゲキの面白さがわからなくなってましたけど、見直せた気がします。

こう見てみると、自分は拘束プレイが好きそうに見えますね…でも拘束と言っても片手処理ゲーというよりパズル的な要素に面白さ感じるのでそういう譜面やりたいですね…(高難易度はだいたい前者になってそう)

とりあえずLv13も開けて好きな譜面を見つけられたらなって思いました。見つけられたときにはまた紹介したいですね。

あと、みなさんの好きな譜面も聞けたらなと思います!ぜひ教えてください(特にLv13以上だとやってないの多いし練習にもなるので助かる)

それでは、また次の機会に会いましょう…虹レ記事かLv13ここすき記事かな



2021年3月15日月曜日

GOTとPLT

CTFのpwn問やると避けて通れないこの用語、やっとちょっとわかったので忘れる前のメモ書きです。

動的リンクと遅延リンク

まず、この2つの用語を理解するためには、動的リンクと遅延リンクの概念を理解する必要があります。

プログラムのコードを書いた後、そのプログラムは機械語に翻訳が行う(コンパイルする)必要があるのは前説明した通りなのですが、その後リンクという作業を行う必要があります。

このリンクというのは、プログラムの実行に必要な変数や関数をつなぎ合わせる作業です。わかりやすい例だとprintf()を使うにはlibcとつなぎ合わせる必要があるということです。

で、このリンク作業を実行ファイルを作るときに全部やって実行ファイルですべて完結するのが静的リンク、実行時に別ファイル(共有ライブラリ)にある関数とつなぎ合わせてあげるのが動的リンクです。

その動的リンクの中で、関数が呼び出されてからリンクを行うのが遅延リンクです。(ちなみに遅延リンク無効の動的リンク、Full RELROは実行時に全てリンクを行います)

GOTとPLT

前節で説明した技術を実現するために使われるのがPLTとGOTです。(Winは違うのを使ってるらしいけど知らんし興味が薄いのでノーコメントで)

GOT(Global Offset Table)

動的リンクを実現するための技術です。ELFファイルだと.got、.plt.got(遅延リンク有効時のみ)がこれに相当します。

リンクが必要な関数をここに切り離してまとめ、テキスト領域(機械語で書かれている、プログラム本体に相当する領域)はここを参照して関数実行するようにしておき、動的リンカは実行はじめにここを関数本体へのポインタに書き換えてあげることで動的リンクが実現されています。

PLT(Procedure Linkage Table)

遅延リンクを実現するための技術です。ELFファイルだと.pltがこれに相当します。

動作としては、関数呼び出しをここ経由にしておき、PLTはGOTを参照して関数を実行します。

最初GOTにはPLTのリンクを行う処理のアドレスを書いておきます。

初めて関数が呼び出されると、GOTはPLTのリンクを行う処理を指しているため、リンクが行われ、その後リンクによって解決した関数本体へのポインタをGOTに書き込みます。 PLTはリンク処理までもっていき、実際のリンク処理は動的リンカが行います。

それ以降はPLTを呼び出すとGOTには関数へのポインタが入っているため、関数本体がすぐに実行されます。(参考:[1])

.plt.got←どっちだよ

実行ファイルを覗くと.got以外に「.plt.got」というセクションがあります。これどっちの名前もついているため、ずっとどっちだよって言ってました。

正解は「PLTが書き換えるためのGOT領域」でした。

じゃあ遅延リンク有効なら.gotセクション要らなくねってなったんですけど、こっちは動的リンカがプログラム実行時に書き換える用のセクションとしての役割があるらしく、簡単なプログラムを書いて確認したところ、__libc_start_mainが.gotセクションにありました。

.plt.gotはその仕様上、書き込みをしなければならないため、遅延リンク有効の場合はどうあがいてもGOT Overritenの脅威がある(という自分での認識)。

遅延リンク無効の場合

遅延リンク無効でも.pltセクションは健在です←なんで?

.plt.gotは使用されず、動的リンカが.gotのポインタを最初に書き換えて、関数呼び出し時は.plt→.got→関数となります。

また、.gotは書き込み不可となっているため、GOTを書き換えてすきな関数を実行するのができません。

参考サイト[2]だけでなく実際に自分でも調べてみましたが、GCC 9.3.0でも同じ動作でした。Clangだと変わったりするのかなぁ

参考

[1] https://blog.tiqwab.com/2020/09/12/shared-library.html

[2] http://inaz2.hatenablog.com/entry/2014/04/30/173618

リンカ・ローダ実践開発テクニック(境井弘亮著 CQ出版社)



2021年3月6日土曜日

負のオンゲキ

みなさま、ごきげんよう。みれんくです。

突然ですが、あなたはセガが出している音ゲー「オンゲキ」をご存知でしょうか?

簡単に言うと「シューティング+音ゲー」です。ノーツに合わせてボタンを押すのと、レバーを操作することがあるゲームです。 

斬新な音ゲーですし、キャラもかわいいので気になったらやってみてください。

いかがでしたか?以下からはぼくのことなので、オンゲキ知らなかった人や興味ない人は戻るボタンを押してくださいね。

 

オンゲキが出来ん

ずっと言ってるけど、成長を感じないんすよね。

オンゲキの技術指標として、レーティングシステムというものがあります。諸悪の根源なんすけど。

そのシステムにおいて、自分は銀レート(13.00)到達が2020/7/28(Lv48)、金レート(14.00)が2020/9/22(Lv64くらい)、現在(2021/3/6)MAX14.36(Lv95)です。次の目標がプラチナレート(14.50)なんですけど…

あがらん、あがらんくてもいいけどできん

周りの人間が虹レ(15.00)目前だったり、後発でやって先にプラレ取られるのもそこそこクるものがありますが、単純に楽曲ができないのが一番キています。

まあ、出来具合を知るのにレーティングシステムは有効だと思っているので、自分が今のところどんなものかを知るためにオンゲキプレミアム契約してOngekiScoreLogで見てみました。

誰でも見れるみたいなのでここから見てみてください。

リーセント低くね???

本当に伸びていないのをひしひしと感じております。ていうか落ちてね?

ボルテはちょっと伸びている(VW金枠麗華→XG金枠魔騎士、VW無枠魔騎士)ので、いったんこっちも本腰を入れようというのが今回の内容です。

こうすればいいのではという考察中心です。結果は追記で書くかもしれないです。

 

なにが悪いのか

人生、分析してバグを潰すのが重要だと思っているのでまず何が悪いのかを考えてみます。

そのいち:オンゲキに本気"マジ"でなかった

それはそう。今までボルテのほうに割き気味だったのであっちで成果が出てこっちででないのは当たり前だと思う。

これの解決法はオンゲキ重点的にやるだけなのでこれで終わりです。

そのに:精度が悪すぎる

ボルテで難曲クリアを目標にやっていたため、精度度外視で押すことと、ほかを捨てて取るべきものを取るというスタンスでやっていたためそれがとても出ているように感じています。

オンゲキのスコアシステムはみなさんご存知の通りBREAK10=HIT2.5=MISS1という、最高判定以外に厳しめになっています。

また、オンゲキは基本、自機のHPが残っている限り曲が終了することがありません。一見良さそうに見えるシステムですが、逆に言えば「音ゲー」をするなら「スコア」を見るしか無くなるんです。

ということは精度を取らないとどうしようもないです。どうしようね。

精度対策

  1. 精度に意識するようにする
  2. Lv12前半を鳥+取る、場合によってはレベル下げる(下げても11まで)

あたりなのかな…時間はかかるけど…

そのさん:認識出来てない

これはボルテにも言えることですけど、認識が弱いです。

ボルテならび赤のCD叩かせるとことか寿司赤の直角+BTのハイハイ言うところとか何を押すかは理解してるけど、リズムがわからないってのがあります。

オンゲキは結構そういうのが12後半から出始めるし該当曲量があるので、本当に厳しい。

また、オンゲキは右左どっちでもノーツが処理できるので、どっちでやるかを判別しないといけないですけど、それも出来てないですね。

対策

  1. オンゲキをやめる
  2. 曲数積む(Lv12~)
  3. ハイスピ変える
  4. 目押し

1は経済的にも精神的にも楽になれると思う。おんなじ境遇の方いたらおすすめします。

が、それは「人生つらぽよ→じゃあ人生やめれば?」と同義なのでぼくはやりません。

2は正攻法な気がしています。12でも開いてない紫が結構あるのでそこを開けるかな…

3が迷っています。基本は10.5(僕的にはちょい遅め)なんですけど、密を避ける為に上げるってのも手なんだろうけど、オンゲキでそれやるとレバーと壁が死ぬのでわからなくなっています。

目線変えるのはちょっと試してみますけど、おうちボルテでやったら微妙だった(レーンの性質上)のでわからん…

速めでやるべきとか遅めでやるべきとかあれば教えてください… 

4もわからん…リズムがわからんなら来た瞬間に押せばええやん!って思ったけど、密度やハイスピに絡んでくるから…

そのよん:トリルができん

 

 

プレイ中無限に言ってる。

対策

  1. リズム取って毎日動かす
  2. 両手をつかう、運指を組む

1については、片手でやる場合に安定しないことが多いため、安定してやれるようにするためにするべきだと思うんだよね。ボルテのトリルも通ってるけどニアか通ってないかだから。

2はオンゲキ固有に近いです。両ボタンつかえることを生かす作戦です。低レべ曲をわざと両手でやるとかいいかも、でも精度も必要だから前に書いたやつと同時にやるのもどうなんだろうね…

 

まとめ

みれんくちゃんの今後にご期待ください

なんもわからん、とりあえず来週の月曜はオンゲキさせてくれ



2021年2月5日金曜日

キミへ贈るArduino

これはなに?

電子工作に使われる「Arduino」について知ってもらう記事です。初期投資も少なく手軽に行えるため、興味がわいたらぜひ初めてみてください。

もくじ

  1. Arduinoって何?
  2. Arduinoボードの種類
  3. Arduinoを使った開発

1.Arduinoって何?

ArduinoはArduinoマイコンボードArduino IDE(開発環境)の総称です。C言語ライクなArduino言語を使ってプログラミングを行います。ボードへの書き込みはArduinoボードとPCをUSBで繋ぎ、IDEの書き込みボタンを押すだけで完了です。専用機器を用意したり、回路を組んで流し込むなんてことは必要なくて敷居が低いです。

また、マイコンボードから開発環境まですべてオープンソースで公開されており、機能追加をしたり安価なパーツを使用して低コスト化を実現した互換ボードがあったりするのが特徴です。

説明からプログラム例まで超まとまっていたサイトがあるので詳しくはArduino のすすめを見てください。

2.Arduinoボードの種類

Arduino公式サイトのHARDWARE(https://www.arduino.cc/en/Main/Products)で現在流通しているArduinoを見ることができます。今回はUno、Nano、Leonardo、Micro、Megaに絞って軽く説明します。

 また、互換機について実体験に基づく注意点を書いておこうと思います。

2.1 Arduino Uno

最も標準的なArduinoボードです。マイコンはATmega328Pが使われています。

センサ入力等に使うアナログ入力ピンが6本(A0~A5)、電圧の高低について読み込み、書き出しが行えるデジタルピンが14本、そのうちの6本がPWM(Pulse Width Modulation)ピンです。

ちなみにPWMピンはServoライブラリを使うときに使用したりします。

また、どのボードでも言えることなのですが、アナログピンはデジタルピンとして使用することもできます。Unoの場合、アナログ入力を行わない場合は最大20本まで使用することができます。

2.2 Arduino Nano

Arduino Unoを小さくしたものです。後に説明するMicroより小さいです。マイコンはUno同様ATmega328Pが使われています。

各ピンはUno同様、アナログピンが8本(A0~A7) 、デジタルピンが14本、うち6本がPWMピンです。

ピンヘッダが実装されているため、ブレッドボードに直接差し込んで利用することができます。

2.3 Arduino Leonardo

Arduino UnoのマイコンをATmega32u4に変更したものです。このマイコンを積んでいるArduinoはHIDデバイスと認識させることが可能で、キーボードやマウスを作ることができます。UnoやNanoでもがんばればできるけど省略します。

アナログピンは12本(A0~A12、裏面に該当デジタルピンが記述されています。)、デジタルピンが14本あり、うちPWMピンが7本あります。複数用途があるピンがあるため、デジタルピンとして使用できるピンは最大20本です。

2.4 Arduino Micro

Arduino Leonardoを小型化したモデル。マイコンはLeonardoと同じくATmega32u4のため、これもマウスやキーボードを作ることができます。

各ピンもLeonardoと同じく、アナログピンが12本、デジタルピンが14本あり、うち7本がPWMピンです。アナログピンについては上記公式ページの「DOCUMENTATION」にある通りとなっています。こちらもデジタルピンは最大20本使用できます。

2.5 Arduino Mega 2560

 

いろいろデカいです。使われているマイコンはATMega2560です。メモリやフラッシュ(プログラムを書き込む場所)UnoやLeonardoに比べて大きいです。

アナログピンが16本、デジタルピンが54本、うち15本がPWMピンです。

2.6 互換機について注意点

1.で説明した通り、Arduinoはハードウェアまでオープンソースとなっているため、Amazonなんかでは互換機がたくさん発売されています。

基本、公式と使い勝手は変わらないのですが、経験上何回か躓いたことがあったので書いておきます。

2.6.1 USBで繋いだときに認識しない

Arduinoのプログラムを書き込むとき、シリアル通信を行って書き込むのですが、そのシリアル通信を行うチップが本家と異なる場合があり、繋いでも認識しない場合があります。

その場合、使用されているUSB-シリアルを確認してドライバを探し、インストールする必要があります。

認識後は本家同様に使用できます。

2.6.2 [重要]一部スペックが異なる場合がある。

めっちゃ大事です。

安いArduino互換機ではレギュレータ(入力電圧を変圧し、一定の電圧を出力するもの)が本家と違う場合があり、最大入力電圧が違う場合があります。

きちんと互換機のデータシートを見て使用してください。くれぐれも公式のデータシートを使わないことです。

ちなみにぼくはこのミスで部所有の互換Megaをひとつ壊しました。あーあ。

3. Arduinoを使った開発

基本的には2.で説明したボードを入手し、PCにArduino IDE(https://www.arduino.cc/en/software)を入れてプログラム書いて書き込んで終わり!って感じです。

…が、それで終わるのもあれなので、VSCode+プラグインを使用した環境を軽く書きます。Arduino IDEより書きやすいと思うので、ぜひ一度試してみてください。

3.1 Visual Studio Code(VSCode)

軽くてプラグインがいっぱいで便利なエディタです。(公式サイト)

Arduino以外にもCやPython、シェルスクリプト等を書くときにも使えますし、入れといて損はないと思います。

何か困ったことがあった時に情報が多いのも強みです。

3.2 プラグイン

この記事(https://qiita.com/narikei/items/847613a8f01a9e1527d7)が役に立ちます。

3.3 Arduino言語

翻訳したリファレンス(http://www.musashinodenpa.com/arduino/ref/)がとても参考になります。

基本、void setup()とvoid loop()で構成されます。setup()は起動時に一回のみ、loop()は起動後繰り返し実行されます。

また、Arduino言語ではプロトタイプ宣言が必要ありません。

あと、タブで記述ファイルを変更できます。機能ごとに分けてあげると使いまわしが効くでしょう。

まとめ

今回はArduinoを紹介しました。マイコンボードではこれだけではなく、ESP32とかSTM32とかあるんでぼくも使ってみたいねえ



2021年2月3日水曜日

キミへ贈るプログラミングのはじめ

これはなに? 

プログラミングというものを全く知らない方向けに、「プログラミングって何をするの?」「何が大事なの?」みたいなのを知ってもらうことを目的にした記事です。

ぼくの考えなどが多くありますが、このセカイの入り口となれば幸いです。また、興味がわいたらそこで終わらず、いろいろ調べて踏み出して欲しいです。

もくじ

  1. プログラミングって何するの?
  2. プログラミングに大事なのって何?
  3. 何をすればいいかな?

1.プログラミングって何するの?

簡単に言ってしまうと読んだ通りです。コンピュータへの命令であるプログラムを、CやPythonといったプログラミング言語を利用して作っていくことがプログラミングです。

…まあここで説明を終えてしまったらこの記事の意味無くなってしまうのでもう少し詳しく説明します。

  

1.1 プログラムって何?

言葉の意味としては「計画」が当てはまります。

今回の「プログラム」はコンピュータプログラムを指していて、コンピュータへの命令を記述したもの、となっています。

しかし、コンピュータには様々な種類があります。普段使っているような PCやスマートフォンはもちろん、電卓や洗濯機などの電子制御が行われている機器(組み込み機器とよく呼ばれます)もコンピュータといえます。

これより、一口にプログラムといっても、組み込み制御のようなハードウェアに近いものから、インターネットのサイトを構築するような人間に近いものまで多岐にわたっています。


1.2 プログラミング言語って?

コンピュータへの命令を人間が行いやすくするためのものです。

また、これで記述された指示書がソースコードと呼ばれています。プログラムの素です。

先ほど説明したプログラムが多様にあるように、プログラミング言語も用途にわけて豊富にあります。したがって、名前を知ってるとかで一つの言語を選んでやみくもに覚えるのではなく、やりたいことに合わせて言語を使い分けるのが大事だと思います。(これは声を大にして言いたい)

 

1.2.1[発展]コンパイラ型とインタプリタ型

難しい話なので飛ばしてもいいです。必要になったら見ればいいと思います。

プログラミング言語のひとつの分け方として、コンパイラ型とインタプリタ型があります。

まず、コンピュータは機械語を読んで動くのですが、人間にはとても取り扱いにくいため(できないことはない、すごい人はできるらしい)、いったん人間に近いプログラミング言語で指示を記述し、それをコンピュータの機械語に翻訳してあげています。

このときの翻訳の仕方で分類がされています。


コンパイラ型

ソースコードを読み込んで、すべて機械語に翻訳してあげるものです。この翻訳作業をコンパイルと言い、ソースコードを書いたり弄っても実行するにはコンパイルを行わなければなりません。

しかし、実行時にコンピュータは機械語を読むだけなので、とても処理が速いという特徴があります。

コンパイラ型で代表的な言語としては、C、C++、Go、Java、Kotlinなどが挙げられます。

(C、C++、Goは実物の機械語に翻訳されて、Java、Kotlinは仮想マシンの機械語に翻訳されるんすけど、詳しくは言いません、気になったら調べてみるといいかもね)

 

インタプリタ型

ソースコードを翻訳しながら実行するものです。コンパイルが必要ない分、ソースコードを変更するだけでプログラムが動きますが、実行と同時に翻訳するため処理が遅くなります。

インタプリタ型で代表的な言語としては、Python、Rubyなどが挙げられます。

 1.2.2 [発展]オブジェクト指向

[執筆予定]

2.プログラミングに大事なのって何?

1を読んでいただけたらプログラミングというものが何となくはわかったと思います。

では、そんなプログラミングには何が大事だと思いますか?自分は

  • やりたいものを見つける
  • 処理を組み立てられるようになる

だと思っています。 

やりたいことを見つける

1で説明した通り、プログラミングといってもいろんな種類があります。そのため、自分がやりたいことがない場合、苦痛でしかないと思います。

プログラミングは手段であり、道具です。目的ではありません。ぜひやりたいことを見つけてください。

処理を組み立てられるようになる

どんなプログラムも、「順次」「分岐」「反復」の動作で構成されています。これを理解し、やりたいこと・実装したいものを組み立てられるようになるのが大事だと思います。

最初はメモ帳や裏紙にフローチャートを書いて、慣れてきたら頭でやればいいと思います。

また、処理はできるだけ細かく考えることも大事です。反復動作の際の1ステップが予期しない動作を行ってしまうことはよくあることです。一度書いてうまくいかないときなどに諦めず、じっくり細かく考えることを意識するのがいいと思います。

3.何をすればいいかな?

まずは2.で説明した「やりたいことを見つける」「処理を組み立てられるようになる」をどうにかしておきましょう。その後はやりたいことの言語を作りながら学べばいいと思います。

最初は一から作ろうとせず、他人が書いたプログラムを読んで動作や言語の書き方を学び、少し書き換えて自分好みの動作をさせたりするのが有効かもしれません。ぼくもそうなので…

以下からはやりたいこと別に言語や道具のヒントを書いておきます。しかし、自分もすべてに精通しているわけではないですし、まだまだ未熟だと思っていますので、この記事を鵜呑みにするのではなく、自分でも調べてみてやっていってください。

ロボット等、実際にモノを動かしたい!

Arduinoを購入し、C言語ライクなArduino言語で開発を行うのが楽だと思います。情報もライブラリも豊富なので入門としてはとても優秀だと思います。後日記事を書く予定です。

また、IoTのようなものが作りたい場合、Raspberry Piというものがあります。これを利用しPython言語でプログラミングを行うことで軽いものは作れます。

ゲームを作りたい!

Unityを導入してC#言語でいろいろやればいいらしい(やったことはない)

スマホアプリを作りたい!

デバイスによって使用する言語やソフトが違います。

Androidスマホ向けであればAndroid Studioを導入し、JavaかKotlin言語で開発することができます。

iOS向けはやってないのでわかりませんが、Macが必要でSwift言語を使用するはずです。現時点でぼくはやっていませんしやる気もないので調べてください。

クロスプラットフォーム(様々なデバイスに対応させる)であればXamarinやFlutter、React Nativeなどのフレームワーク(開発基盤)があります。これもやってないので詳しくは調べてください。

PCソフトを作りたい!

コマンドを打って操作を行うCUI(Command User Interfaceの略です)ソフトであれば、C言語が手っ取り早いと思います。より多機能にしたい場合はC++言語が便利だと思われます。C++ヤバイって聞くけど舐めるくらいならCに毛が生えたくらいなので恐れなくてもいいかも…ただ怖い人がいっぱいいるのも事実なのでノーコメントで…

画面操作するタイプ(GUI: Graphical UI)でWindowsであれば.NETという便利なものがあります。(これもやってないから調べてね)

クロスプラットフォームで開発したい場合はJavaやKotlinなどがあります。Pythonもクロスプラットフォームで動き、大体なんでもできます。

Webページを作りたい!

見た目の中身にはHTMLとCSSというものが使われています。作り方はわかんないです…ぜったい便利なものがあると思いますがあんまり興味ないので…

あとがき

書いていて自分の未熟さをとても感じました。この記事を読んで少しでも興味を持った方、一緒に精進しませんか?