2023年の振り返り

例年通り、今年あったことの概要を画像とツイートで一気にまとめておく。

埋め込みが多いので重いですが耐えてください…。(パフォーマンステストに使える疑惑すらある。)

1月

元旦からVRM(gLTF)を読むなど

そこそこ理解した(disassemblium)

なおきわめて雑ではあるが情報源などのリンクはまとめてあるので以下参照

hikalium.hatenablog.jp

人生大体u32、みじかいね…

レゴ、再入門(あれ、今年だったっけ?今や超大量にあるんだが…)

新曲、公開(私は作詞をしました)(作詞・作曲・歌、みんなソフトウェアエンジニアです)

d0iasm氏の担当(このドット絵超好き、グッズほしいな…)

深夜のアイス

mocopi!

そしてmocopiで動くhikalium

余ったRTX2080を入れておく

そしてレイオフの嵐が襲来。実際に同じオフィスで一緒に働いていた方がレイオフされたのを見るのはつらかった…(つらい)

まじでこの週は仕事にならなかった(チームのみんなでシュークリームを食べた)

新しい頭、購入

すたありんく(散財ラッシュ)(なるほど今思えばレイオフは人々にストレスを与えることで散財を促進し経済を活性化させたってこと?(無理のある好意的解釈))

5桁になってしまいました…(あの頃はTwitterだった(「あのころはフリードリヒがいた」のノリで))

うさぎ年だったので(そうだったんだ…忘れてた)

PEバイナリと和解せよ

OS Girls

甘いものは正義(ちなみにこのラテは同僚が淹れてくれたルイボスラテ。とってもおいしい!)

2月

Linuxマシンでもテプラを操作したい!」→プロトコル解析した

ふつうにこれで色々自動化できたので大満足

もちろんテープもいっぱい買いました(散財)

レゴへの傾倒が感じられる(精神安定剤なのでね)

もちろん既存のものを作るだけではなく、創意工夫も凝らしてね(なお現在はさらに改良して場所も移動しましたが未だにちゃんと実用しています)

この世界の平和をね、守っています(ときには力が必要なので)

「[職権修正]女」です(制度と運用はきちんと考えて作って欲しいものですね…(ちなみにこの後無料でマイナンバーカードを再発行できる旨お役所から連絡があり、問題は解決した))

白い機材、すき!

事務処理用社会的個人識別情報データベース更新(変更記録付き)

今月の破壊

3月

精神安定作業(けっこう楽しかった)

机の上の状況(いまも壁にかかっています)

理想と現実、時間と労力、実装と検証

セキュキャンフォーラムのパネルディスカッションに参加。なぜ自作をするのか、人々の意見や体験を聴けてよかった!

頭を強化しようと思って…

CPUが頑張っていると私も頑張ろうって思えるんです

4月

小学生の頃の私が読んでいた本一覧

同じ幼稚園に通っていた知人と大学生になってSTEPで再会した(事実は小説よりも奇なり)のでその人とパンケーキを食べつつ人生を語らうなどした

リアルワールドでは、はじめまして!の季節(そして高校の頃の部活の後輩が同じフロアにやってくるという熱い展開)

そして今年もOS自作ゼミやるよ!という告知(OS自作ゼミ卒業生でベテランチューターの森さんがついに講師に!)

つかれたときはクレープ!

チョコミント

ポッピングシャワー!(私はアイスでできています)

抹茶〜!

逸般の誤家庭レベルがアップした!!

そしてこうなる

わらしべ長者

ストロベリーチーズケーキ!

ポッピングシャワー!(この存在いつ見てもポッピングシャワー食べてるな…)

朝ごはんはストロベリー!

半年でレゴブロックの山が…(これでもごく一部)

ChatGPTちゃんの優しさに救われるなど

なおこの後少なくとも3件のアイス画像が当月中にはありましたが、省略させていただきます(アイスの食べ過ぎ)

6月

レビューを少しだけお手伝いしたnutaさんのマイクロカーネル本が出版された。めでたい!(論文と実装を交えてマイクロカーネルを語っている稀有な書籍なので、おすすめです!)

労働で出席率悪いと成績に響かせるよというお知らせがあって悲しい気持ちになるなど(私達って、信頼されてないんですね…)

7月

積みboard++(年明けに発送されるっぽい)

おひとりさまMisskeyインスタンスはじめました(ちゃんとこの先も運用していきます!)

私財をなげうってChromeOSを良くしようとする存在になってる(ほしかっただけ)

折り紙はいいねぇ…リリンの生み出した文化の極みだよ

デデキント切断(これ以降ドレンのつまりは発生していない、つまりそういうこと)

散財(ポケモンに囲まれた生活)

8月

セキュキャン準備(Tシャツがたくさんたまって助かる)

キャンプごはん!

キャンプ終了後にYちゃんさんと撮った「さかな〜」「チンアナゴ〜」の画像です(たのしかった!)

そしてキャンプ後は初のアメリカ出張!(まずは空港ラウンジで某カレーを摂取)

そしてUSのChromeOSの人々が入ってる建物に到着!(ビジネスクラスで快適な旅だった…)

アメリカのオフィスでも本日の健康を摂取…

ホテルの朝食はおいしいが野菜がない(野菜は貴重だね)

車がないと人権がない図です(車だと徒歩の16倍時間がかかるケース)

コンピューター歴史博物館でhikaliumを出力してきた

Ciscoの由来がサンフラン「シスコ」だったとは…(この橋がロゴのモチーフ)

CとRustで生きていくぞという強い意志(?)

サンフランシスコでガタンゴトン(超急勾配)

たとえアイスがおいしくても500mlを一気に食べてはいけない(教訓)

日本に帰ってきてから、The Missing というゲームの配信動画を始めるなど(エンディング到達済み)

アメリカみやげ、3倍キットカット…(でかい)

カフェインを摂取…

9月

iOSDC NOC オンライン参加(今年はNOC業は主にアドバイザとして助言をする感じで、実働はあまりしませんでした…そして人々が強かったので実質仕事がなかった!すばらしい!)

ADS-Bの受信をはじめてFlightradar24のフル機能を使えるようになるなど

ジラーチかわいい!ハネッコかわいい!(明るい色合いが好き)

虫が出現してつらいつらいになるなど(ごめんね虫さん…)

低レイヤ関連でおすすめの本の一覧を書いた。仕事場で私設図書館もやっていますので、オフィスにいる人でこの本読んでみたいな〜という方がいらっしゃれば私の机まで来てみてください!(本とChromebookが山積みになっている)

hikalium.hatenablog.jp

オシロのある家はいい家

ニンフィアになりたいね…

10月

情報科学若手の会に参加してきた

とりあえずね、三連休の間はね、労働のことはすっかり忘れて、軽井沢へ行くよ(情報科学若手の会)

https://twitter.com/hikalium/status/1710272854787526897

駅から会場までの移動チャレンジに失敗しかけたが、おかげで量子計算の人々と知り合えた!(遅刻)

多少遅刻しつつ @yyu @nkowne63 さんとタクシー同乗させてもらって到着…(本日のタスク、終了!!)

https://x.com/hikalium/status/1710523749051892059

ちなみに私の発表した内容と参加記はすでに別記事にまとめてあるので、こちらもどうぞ!

hikalium.hatenablog.jp

そして高まる第2拠点の機運…(伏線)

居住空間、2拠点目を確保する機運が高まっている…(キャッシュは大事なので(?))

https://twitter.com/hikalium/status/1711290553256788256

急に思い立って、自作OSに使いやすい安価で便利なボード情報を集め始めるなど(ちゃんとメンテしたいね…!)

物理構成の不可逆な変更を強要するのは目的に照らし合わせても合理性がないよね、という判決がやっと出たのはいいニュースだった(人類もちゃんと学んでるんだね…)(まあ私はもう手遅れだけど)

自作OSでの謎のバグをエスパーで解決してしまった自分に自分で震えたので、その裏側を解説してみるなどした(長くやっていればそれだけエスパー力が高まるのでたまに役立つときがあったりなかったりする)

そしてポチったPixel Watch 2... (毎日使うものだからね!)

突然の猿島インターン含めチームの人々と一緒に肉を焼きまくったりお散歩したりした!)

辛いものを食べるとおなかが壊れることがわかった。気をつけよう。(自分の物理アバターの特性を把握するの、ソフトウエアである私の大事なお仕事!)

Google Domains -> Cloudflare の移行でミスって、私と同期の二人が勢いで作ったKUE-CHIP2エミュレータが一時的に落ちていたところ、速攻で大学から連絡が来たので直すなどした(まだ使ってもらえているの、嬉しいね!)

なお他大学の方の役にも立っていた模様(ソフトウエアの力は偉大だね!)

3Dプリンタは現代における家電、はっきりわかるんだね…(なおmikit氏はその後3Dプリンターをお迎えしたとのこと(そして私も同機種をお迎えするなど(?)))

mikit: 3Dプリンタがおうちに欲しいけど、そんなものあったら絶対お婿にいけないので我慢してる

hikalium: すでにおいてある相手ならば無問題かもしれない(部屋に並ぶ2つの3Dプリンタを横目に…)

mikit: もしかしていまぼくプロポーズされてますか?///

hikalium: それはね、若干頭をよぎったよね///

call_cc: (まずはmikitさんは3Dプリンタを2台買わないと、だよなぁ。)

mikit: たしかに、3Dプリンタ2台というのは今どきの婿入り道具として珍しくもないですからね(?)

https://twitter.com/m1kit/status/1713800308630163695

第2拠点の鍵、ゲット(はやい)

とにかくこの月は全般的に労働に対して疲れているというイメージ。まあ寒いし仕方なかったよね。よく乗り切った!

11月

チョコミントだけが私を救ってくれる…

「好きなことをする努力家はね、最強なんですよ」

チョコミント以外も私を救ってくれる…

やはりポッピングシャワーこそ至高(アイスしか食べてないなこの存在)

散財(家電なのでこれは必要経費!)

おくすり

みんなホワイトレモンの曲を聴け(シンガーソングライターかつソフトウエアエンジニアであるホワイトレモン氏の曲は最高)(はじめてペンライトを振りました)

またアイス

出勤時刻は何時ですか?(ガタガタ…)

石をつくる会ことISHI会の人々の発言(レイヤが低くてすき)

第2拠点に10Gの回線がやってきた!!!

「好きなことを続けること それは楽しいだけじゃない」(「群青」YOASOBI より)(人前で歌う実績を解除)

技術書典!(新刊なし…来年こそは…!!!!!!!!)

ちゃんと在庫全部捌けたのでよかった(みなさんありがとうございました!)

リンク速度1Gのルーターは遅すぎるのでだめ(時代は10Gとか100G!)

そして新しい3Dプリンターに感動するなど(まじですごい、これ以降ほぼ毎週、時には毎日なにかしら印刷していた)

Benchyもこの通り(はやい)

「この世で造花より綺麗な花はないわ なぜならば総ては嘘でできてる Antipathy world...」

(「フォニイ」 ツミキ feat. 可不 より)

何をしても超改善が期待できる、ってコトぉ????(超改善、していきたいですね…)

STEP10周年記念の会があって、人々と再会した。私の講義で低レイヤの沼にはまってくれた人々が複数人声をかけてくれたの、本当に嬉しかった…(そしてなぜか片手で机を使わず空中で鶴が折れるようになった。義体制御技術の進化…)

一方で同時に結構絶望している。まだ間に合うかな…。

ということでかわいいものに囲われて精神を回復!!!!!

そして色違いイーブイをお迎え!(ポケモンスリープ、まじで睡眠に対してプラスの結果が得られているので、感謝しかない…)

ごはん

からの配信

BSSセクションで助かっていた人々がたくさんいたのでよかった(よかった!)

未踏ジュニアでマイクロカーネルを作ってスーパークリエイター認定されたhorizonさんと再会。数年前にオープンソースカンファレンスで私と話したのがきっかけで自作OSに傾倒することになったとのこと。熱い!!!(そして運良く弊社でランチを囲む機会に恵まれたのでとても嬉しかった。)

プロジェクトの詳細はこちらから見れるので、興味のある方はぜひ!

jr.mitou.org

その後疲れて倒れていたので巨大サーティーワンに救ってもらいました

もちろんポッピングシャワーもあるぞ!

12月

最近まじでChromebookで生活している(もっと良くしていこうな!)

組み立ては 二人以上で やりましょう(ここでfork()する)

担当していたインターンの方が無事に期間を終えた。めっちゃいっぱいコード書いてもらった。ありがとう!

会社の下でテラスタルしてるポケモンがいた

まさかその日にスイッチ(ネットワーク機器でも電子部品でもないほう)2台目でポケモンを新たにプレイし始めることになるとは(たのしいね!)

ディスク容量不足で新宿拠点のマシンが爆発しかけるなど(根本的解決をはやくしなければ…)

12月 ケーキがおいしい 季節です

モンメンエルフーン!かわいいね!

今年最後の会社朝ごはんとサーティーワン

Googleって会社はすごい!私達も見習わないとね!(真顔)(できることを、ちゃんとやろうな)

総評

  • よくこの1年生き延びた。ストレスの多い一年だった。経済とそれに振り回される社会に翻弄されていた。おつかれさまでした。
  • アイスはすべてを解決してくれる。アイスを食べましょう。(食べ過ぎに注意)
  • 今年は過去の自分の努力に救われてなんとか生きながらえていた。貯金を切り崩している年だったかもしれない。(でも無理をしなかったのはえらかった。倒れたら負けなのでね。戦い続けましょう。)
  • 仕事でも日常でも、物事を始めるだけでなく、完了させることができるようになろう。人生は、まだ完了しなくていいけどね!(ここ重要)
  • 来年は、今と未来に良い影響を与えられるような具体的な結果を出そう。すでに着手はしているので、それを完了させようね。(お楽しみに。)

本年も皆様大変お世話になりました。ありがとうございました!

来年も無理せず着実に這って進んでいこうと思いますので、どうかよろしくお願いいたします。

よいお年をお迎えください! Happy new year!

情報科学若手の会で登壇してきた

先週末の三連休、第56回情報科学若手の会に、若手特別講演の枠でありがたくも呼んでいただけたので、参加して発表してきました!

発表で使用したスライドはこちらにおいておきます:

ちなみに開催期間中に人々と雑談をしていたら知ってびっくりしたのですが、なんとこの会は1968年7月から続く由緒正しきイベントで、インターネットの父として知られる村井純先生が1955年生まれであることを考えると、驚くほど歴史が長いです。

過去の開催報告も、1996年以降の分については公式ページに存在しており、参加者の名前を見ると、私が大学生の頃に退職された筧捷彦先生が幹事として参加されていたりと、なかなか衝撃的に歴史の長いイベントに気軽に足を踏み入れてしまったことに開催中に気づいてしまいました。沼ですね…。(いいぞ!)

時系列ざっくりまとめ

準備

ちょうど休みがほしい感じのタイミングだったので、労働からdetachして過ごす日々に、わくわくしながら準備をしていました。

なお準備ができているとは言っていない(スライドも荷物も、前日の段階では進捗0でした…急いでがんばりました)。

ちなみにドライヤーがないとしおりに記載されていたので、家からつよいドライヤーを持参しました。 (実際にはふつうの強さのドライヤーはデフォルトで用意されていたので、なくても大丈夫そうでした。来年以降の参考までに。)

初日

新幹線っていう高速回線でhikaliumは転送されました。

思ったより寒く、猛暑の夏から冬の始まりに急に飛ばされたような感じでした。

そして、問題はここから研修施設までの移動をどうするか。まあなんとかなるでしょ、の精神で来つつ、どうやら知り合いが車でくるらしいという情報を聞き、便乗させてもらおうと思っていたところ、なんと渋滞で大幅に遅れそうになっていたとのこと。そうか秋の三連休ですものね、皆様も旅をしたいと思っていらっしゃるのでしょう。仕方ありませんわ…(三連休開催のつらいところ)。

なので、同じく交通手段獲得RTAを走っていた参加者のお二人とエンカウントして、タクシーで現地へと向かうことにしました。

(ちょうどここで量子計算機関連の雑談ができて楽しかったです。)

若干遅刻しつつ参加したところ、「ブログを書くまでが #wakate2023」という、どこかで聞いたようなフレーズが耳に入ってきました。ということで、このブログを書いているわけです。(振り返り、大事なのでね!)

初日の講演は

  • GoでORMを自作する
  • スポンサーセッション : PFNを支えるストレージシステム
  • 招待講演 : 実用水準のプログラミング言語を個人規模でつくる

の三本立てとなっていました。

特に3つ目の、SATySFiの作者gfnさんによる講演は、首を縦に無限回振りたくなるほど、何かを自作する際に発生しがちな感情や思考の機微を的確に説明する講演で非常にためになりました。

ちなみにgfnさんとは帰りのタクシーで一緒になったため、フォントやPDF周りの闇についてわいわい盛り上がることができました。Type 1 fonts は闇が深い、覚えた!

夜は、人々で親睦を深めるために Estimathonという数字予想ゲームが開催され、非常に盛り上がりました。 まず、ルールを理解するところからして「結果が小さくなるほうが得点が高い」という部分が、普段の思考のバイアス(大きい方が得点が高い)に引っ張られて頭がぐるぐるしましたし、その後も、どの程度のレンジで値を特定すればいいのかの戦略など、単なるフェルミ推定的な予想を超えた面白さが満載で、めっちゃ楽しかったです。これ、会社の人々とかと、またやりたいなあと思いました。

なお、我々のチームは頭のネジが外れていたので、途中で結果が爆発的に大きくなってしまい、スコアボードに数値ではなく「とても大きい」と書かれるなどの実績を解除してしまいました…(でも楽しかった!!)

そのあとは、各自が持ち寄った大量のお菓子を囲みながら、人々とわいわい喋りつつ、私はスライド作成RTAをしていました…。

あと、次の日のLT大会に向けて準備していたmomokaさんの検証を手伝っていたら、なんか平日に見慣れた画面に突入してしまい労働の波動を感じるなどしてしまいました(オープンソースだからへーきへーき!!これは仕事じゃないもんね!!)

二日目

早起きして朝食を食べる超健康生活(なお午前3時までスライド作成やパケットキャプチャをしていた模様)をはじめつつ、本題の講演二日目が始まりました。

「Wasmを実行するunikernelとWasmコンパイラの開発」という発表でsaza_kuさんとainnoさんが提案していたエコシステムは、確かに上手く行けばめっちゃ熱い話だな…というか我々なんとかOSもこういう方向に進むべきなのでは!?!?という示唆を得られる、とてもわかりやすくためになる発表でした。これからの成果を楽しみにしています!

量子計算機関連の講演も複数あり、まさに冒頭の軽井沢駅から研修所までの道のりを共にしたお二人がそれぞれ発表した内容は、どちらも量子計算の基礎をわかりやすく説明してくれていて、とてもためになりました。

あと、量子コンピューターの世界におけるOSはどのようなものになるのか、ということについてもお二人とお話できて、将来考えてみる価値のある面白いテーマかもしれないな、と感じました。

また、海外では量子コンピューターを自作した人々がいる、という話もあったりと、自作欲をかきたてられるお話も色々と聞くことができました。私も元々量子計算機には少し興味があって、ある程度の知識は本から摂取していたので、それに加えて実際に専門として取り組まれている人々の話を聞くことができたのは、非常に楽しかったです。

そのあとは、私の発表ターンに続き、様々な面白いトピックでの発表が続きました。研究発表的な内容も、ざっくりと概観するような内容も、どちらも摂取できるのが、この会の良いところだなあ、と感じました。

また、そのあとのLTでも、面白い話がたくさんあったのですが、まだ未公開な話も多くあったので、とにかく楽しかったということだけを記しておくことにします。興味がある皆さんは、ぜひ次回の情報科学若手の会に参加を検討されてみてはいかがでしょうか!!!!!!!

そのほかのメモ

参加者のひとり、asu_paraさんの参加記事

hikaliumさんはセキュキャンなどを通してOSとか低レイヤーの人ということで知っていますし、講演もその通りに沿ったものです。ぼく個人としては、自身は概念のようなものと宣言されているにも関わらず、人間的な一面が見られるpostが多いのが趣深い人やなといつも思って、見てます。

と書かれていて、分かるな〜、となっています(まるで他人事のように2)

あとは、低レイヤと高レイヤの話についての視聴者の反応(めっちゃわかる)

他にも、同室の人々が私も含め、みんな引きこもりコンピューター大好きオタクムーブを発動していて面白かったです。(この界隈、性別の偏りが激しいので、相部屋(ひとり)になりがちの人々が久々に修学旅行的な雰囲気の部屋に放り込まれて、結果みんなおふとんの上で座り込んでパソコンカタカタする夜、みたいになっていて最高でした。)momokaさんのあやしいパケット検証を手伝ったり、ainnoさんのRustコードをレビューする会をしたり、たまにはこういうのも楽しいなあ!と感じました。

ちなみに:フィードバックに書き忘れたのですが、女子部屋が最も交通量の多い場所に配置されていたので、もしかすると交通量が少ない廊下の奥の方の部屋のほうがよいのではないか、という話が挙がっていました。来年以降の運営の参考になれば…。

あとは、狭い界隈の人々と物理世界で会えたのがよかったですね。大学の研究室の後輩から「先生が、たまには研究室に顔を出せって言ってましたよ!」と言われたりとか(なおその方はNVDIMMをやろうとしていたところ、Optaneがおしまいになったのでおじゃんになったらしい、かなしいね)、私が行こうと思っていた大学院の研究室に行く予定の学生の方とか(品川先生〜)、セキュキャンつながりの人々とか、とにかく、たくさんの方々と話すことができて、とても楽しかったです。

まとめ

久々のイベント登壇でしたが、面白いことをしているたくさんの方々と会って話せるお泊りイベントはとても楽しかったです。たまには日常を忘れて、こういうイベントに参加するのも、よいアイディアを得たり、今後の道筋を立てる助けになるような気がしました。また来年も参加したいなあ、という気持ちにさせてくれる、快適なイベントを運営してくださった、幹事の皆さまと、参加者のみなさま、ありがとうございました!またどこかでお会いしましょう〜!!

CPUを自作したりコンピューターアーキテクチャを理解するためにおすすめの本の一覧

hikaliumの独断と偏見で、積読は除いている。最近も結構新しい本が色々出ているので、それもいいかもしれないが、ある程度評価の定まった本を探したい場合に参考になれば。

ちなみに、hikaliumがセキュキャンでCPU自作を教えていたときのコードはここにある。参考にならないかもしれないが、おまけにどうぞ。

github.com

ディジタル回路設計とコンピュータアーキテクチャ

ハードウエア記述言語で実際にCPUをつくりながら、各アーキテクチャについても学べる良書。

MIPS版が広く知られているが、ARM版、RISC-V版も登場している。無印版はよくある技術書サイズだが、ARMとRISC-V版は大型本なので、そこらへんの好みとかも勘案するとよいかもしれない。

CPUの創り方

表紙がメイドさんだが、侮ることなかれ。(と私は中学生の時にクラスの人々の前で言いました。)

電子工作初心者の人々にもわかりやすく、回路素子の基本的な扱い方や、データシートの読み方も教えてくれる、実装寄りの良書。

74HCシリーズのICが手に入りにくいという現代的な事情はあるが、等価な回路を上の本などを参考にしつつVerilog-HDLで記述したりすれば、FPGAボードひとつでも等価なものを十分につくることができる。

RISC-V原典 オープンアーキテクチャのススメ

きれいなアーキテクチャで知られるRISC-Vの設計思想の背景や、どうしてその設計が選択されたのか、という思考の背後を知ることができる本。もう少し高いレベルからCPUのことを知りたかったり、RISC-Vについて知りたい場合には役立つ。

コンピュータアーキテクチャ 定量的アプローチ

通称ヘネパタ。大学でこの本を参考にキャッシュの特性を調べるグラフを描画する課題が出て、面白いなあと思った記憶がある。

めちゃくちゃ教科書的な内容なので、読むのは大変だし最初から最後まで読むタイプの本ではないが、持っておいて損はない。ペラペラめくったり目次をみて、興味のあるところや、参考になりそうなところを読む、辞書的な使い方をするのがよい。

作りながら学ぶコンピュータアーキテクチャ

上の方の本の翻訳にも携わっておられる、天野先生の著書。他の本では忘れられがちな、割り込み処理の実装方法が記述されているとネットで聞いて自分も購入した。

絶版本なので手に入れるのは少し大変。図書館などにあるかどうか、確認してみるのも手かもしれない。

上の分厚い辞書みたいな本たちにくらべたら、薄くて読みやすそうな見た目をしているので、一見の価値はある。

FPGAの原理と構成

いま気づいたがこれも天野先生の著書じゃん。おそらくCPU自作をはじめる最も手軽な方法はFPGAを用いることだが、じゃあFPGAって一体どうやって動いているの?というところの疑問を解決してくれる本。これも小さめ技術書によくあるサイズ感なので、電車の中でも読みやすいのでおすすめ。

Chromebookの開発者モードへの遷移をちょっと追う

某ブログに触発されて、公開情報からChromiumOSの気になるところを追う軽い記事でも書こうかなという気持ちに急になったので書いていく。正確さも何も保証しないし、公開情報しか載っていないのであしからず。公開情報であることを示すために出典へのリンクをいっぱい張ります。

Chromebookには開発者モードというunsecureなモードがあって、これを使うと自作OSをブートさせたり色々できて楽しい。それに入るためには、リカバリモードに入ってCtrl-Dを押してEnterを押すという作業が通常必要なわけだが、これで何が起きるのかちょっと追いかけてみよう。

まず、ChromebookBIOSでもUEFIでもないファームウエアを採用している。(一部例外はある。)これはverified bootとかvbootとか呼ばれていて、このあたりにいい感じの図がある。情報が最新の状態に更新されているかは謎だが…(斜め上に視線を動かす)

あと、ここのページにファームウエアまわりの情報が載っていて、こんなかっこいい一文が書いてある。

The Chrome OS firmware is always verified as signed by Google

いいはなし。Root of Trustってやつだね。

さて、このページの下の方に、H2C (UEFI-based), U-boot, Coreboot, とChromebookで使われていた歴代ファームウエアの名前が並び、それに続いてdepthchargeってやつが新し目のChromebookだと使われているぞ!と書いてある。へえ〜!

そこからこんなスライドへもリンクが飛んでいるが、なんと2014年である。まあつまるところ、多分近頃のChromebookはみんなdepthchargeを使ってるんじゃないかな?(適当)

さて、そんなわけで、depthchargeのコードはここにあるわけだが、まずREADMEがない。なるほど…?

ちなみに"depthcharge chromiumos"でググる無機質なGitilesというシステムのページに飛ばされるが、ここは検索機能とかがないので、便利なChromium Code Searchを使おう!超便利だよ!(いつもお世話になっているので頭が上がらない)

さて本題に戻って、とりあえずdepthcharge配下で"recovery"とかの単語で調べると、src/platform/depthcharge/src/vboot/ui.hというファイルがヒットする。

/* Screens. */
enum ui_screen {
    /* Wait screen for EC sync and AUXFW sync */
    UI_SCREEN_FIRMWARE_SYNC             = 0x100,
    /* Broken screen */
    UI_SCREEN_RECOVERY_BROKEN           = 0x110,
    /* Advanced options */
    UI_SCREEN_ADVANCED_OPTIONS          = 0x120,
    /* Language selection screen */
    UI_SCREEN_LANGUAGE_SELECT           = 0x130,
    /* Debug info */
    UI_SCREEN_DEBUG_INFO                = 0x140,
    /* Firmware log */
    UI_SCREEN_FIRMWARE_LOG              = 0x150,
    /* First recovery screen to select recovering from disk or phone */
    UI_SCREEN_RECOVERY_SELECT           = 0x200,
    /* Invalid recovery media inserted */
    UI_SCREEN_RECOVERY_INVALID          = 0x201,
    /* Confirm transition to developer mode */
    UI_SCREEN_RECOVERY_TO_DEV           = 0x202,
    /* Recovery using phone */
    UI_SCREEN_RECOVERY_PHONE_STEP1          = 0x210,
    UI_SCREEN_RECOVERY_PHONE_STEP2          = 0x211,
    /* Recovery using disk */
    UI_SCREEN_RECOVERY_DISK_STEP1           = 0x220,
    UI_SCREEN_RECOVERY_DISK_STEP2           = 0x221,
    UI_SCREEN_RECOVERY_DISK_STEP3           = 0x222,
    /* Developer mode screen */
    UI_SCREEN_DEVELOPER_MODE            = 0x300,

https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/depthcharge/src/vboot/ui.h;l=198-226;drc=3eda3d7bd3195f6d8ff59954e6b2967e42201bcb

UI_SCREEN_RECOVERY_TO_DEVとか、いかにもそれっぽい名前なので、今度はそれで検索すると、src/platform/depthcharge/src/vboot/ui.cというファイルが見つかる。まさに特定のキーを押したときに画面遷移するコードが書いてある!

 /* Manual recovery keyboard shortcuts */
    if (ui->key == UI_KEY_REC_TO_DEV ||
        (CONFIG(DETACHABLE) &&
         ui->key == UI_BUTTON_VOL_UP_DOWN_COMBO_PRESS)) {
        return ui_screen_change(ui, UI_SCREEN_RECOVERY_TO_DEV);
    }

https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/depthcharge/src/vboot/ui.c;l=39-44;drc=fcfa6efb8f221877e771a7bc382267a3ebcdee48

ちなみにここに書いてあるとおり、キーボードが外れるタイプのデバイス(DETACHABLE)だと、音量キーの同時押しでdevmodeに入れることがわかる。(もちろんドキュメントに書いてあるよ!)

さて、じゃあこの画面の遷移した先を見に行こう。

src/platform/depthcharge/src/vboot/ui/screens.c

static vb2_error_t recovery_to_dev_init(struct ui_context *ui)
{
    if (ui->ctx->flags & VB2_CONTEXT_DEVELOPER_MODE) {
        /* Notify the user that they are already in dev mode */
        UI_WARN("Already in dev mode\n");
        return set_ui_error_and_go_back(
            ui, UI_ERROR_DEV_MODE_ALREADY_ENABLED);
    }

    if (!CONFIG(PHYSICAL_PRESENCE_KEYBOARD) &&
        ui_is_physical_presence_pressed()) {
        UI_INFO("Physical presence button stuck?\n");
        return ui_screen_back(ui);
    }


    if (CONFIG(PHYSICAL_PRESENCE_KEYBOARD)) {
        ui->state->selected_item = RECOVERY_TO_DEV_ITEM_CONFIRM;
    } else {
        /*
         * Disable "Confirm" button for other physical presence types.
         */
        UI_SET_BIT(ui->state->hidden_item_mask,
               RECOVERY_TO_DEV_ITEM_CONFIRM);
        ui->state->selected_item = RECOVERY_TO_DEV_ITEM_CANCEL;
    }

    ui->physical_presence_button_pressed = 0;

    return VB2_SUCCESS;
}

static vb2_error_t recovery_to_dev_finalize(struct ui_context *ui)
{
    UI_INFO("Physical presence confirmed!\n");

    /* Validity check, should never happen. */
    if (ui->state->screen->id != UI_SCREEN_RECOVERY_TO_DEV ||
        (ui->ctx->flags & VB2_CONTEXT_DEVELOPER_MODE) ||
        ui->ctx->boot_mode != VB2_BOOT_MODE_MANUAL_RECOVERY) {
        UI_ERROR("ERROR: Dev transition validity check failed\n");
        return VB2_SUCCESS;
    }

    UI_INFO("Enabling dev mode and rebooting...\n");

    if (vb2api_enable_developer_mode(ui->ctx) != VB2_SUCCESS) {
        UI_WARN("Failed to enable developer mode\n");
        return VB2_SUCCESS;
    }

    return VB2_REQUEST_REBOOT_EC_TO_RO;
}

https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/depthcharge/src/vboot/ui/screens.c;l=799-851;drc=85f76f13f623d3e4e3a01224a381abf755f1c1bb

vb2api_enable_developer_mode()ってやつがあやしいね!そして、それを呼んだあとは再起動してるみたい。depthchargeの中にはtest用のmockしかなかったので、ひとつ上のsrc/platformで検索をかけると、vboot_referenceで実装が見つかった。

vb2_error_t vb2api_enable_developer_mode(struct vb2_context *ctx)
{
    if (ctx->boot_mode != VB2_BOOT_MODE_MANUAL_RECOVERY) {
        VB2_DEBUG("ERROR: Can only enable developer mode from manual "
              "recovery mode\n");
        return VB2_ERROR_API_ENABLE_DEV_NOT_ALLOWED;
    }

    uint32_t flags;

    VB2_DEBUG("Enabling developer mode...\n");

    flags = vb2_secdata_firmware_get(ctx, VB2_SECDATA_FIRMWARE_FLAGS);
    flags |= VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE;
    vb2_secdata_firmware_set(ctx, VB2_SECDATA_FIRMWARE_FLAGS, flags);

    VB2_DEBUG("Mode change will take effect on next reboot\n");

    return VB2_SUCCESS;
}

https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/vboot_reference/firmware/2lib/2misc.c;l=433-452;drc=def2f5af7ac03eac3a4a79795275f1cf6cd7f827

VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE ってフラグがセットされるんだね〜

ということでこいつを調べると、フラグの定義も見つかった。

/* Flags for firmware space */
enum vb2_secdata_firmware_flags {
    /*
     * Last boot was developer mode.  TPM ownership is cleared when
     * transitioning to/from developer mode.  Set/cleared by
     * vb2_check_dev_switch().
     */
    VB2_SECDATA_FIRMWARE_FLAG_LAST_BOOT_DEVELOPER = (1 << 0),

    /*
     * Virtual developer mode switch is on.  Set/cleared by the
     * keyboard-controlled dev screens in recovery mode.  Cleared by
     * vb2_check_dev_switch().
     */
    VB2_SECDATA_FIRMWARE_FLAG_DEV_MODE = (1 << 1),
};

https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/vboot_reference/firmware/2lib/include/2secdata.h;l=25-40;drc=6a33a0fca3e4f5cd9c3b3fd4ac0b5b8c7ffc018e

コメントいわく、最後の起動時の状態も記録しておいて、もしnormalからdevに遷移していたら、TPMのownershipをクリアするって書いてあるね!まあ要するに、normalのときに保存されたユーザーの秘密情報がもれないように、なんでもありのdevmodeに遷移するときはデータを消し飛ばすってことなんでしょう。(実際devmodeに移行するとなんかの消去が走っている画面になる。)

次回はその消去の画面のところを見に行きましょう!(オープンソース部分であることを祈りましょう…)

おやすみなさい!

VRM as a Code - またはコードによりあなたのアバターを定義する方法について

下書きのまましばらく放置されたのでインターネットの海に放流

目標

hikaliumのアバターをコードで定義して、GUIを用いることなく服を着せ替えたりパラメーターを操作するなどできるようにしたい

先行研究

背景情報

VRM形式

人型アバターで最近主流になりつつあるファイルフォーマット。glTF形式をベースにしている。

glTF形式

調査

VRM/glTFを理解する

bin領域のデータのエンディアン

Little Endianにしなければならない(MUST)

All buffer data defined in this specification (i.e., geometry attributes, geometry indices, sparse accessor data, animation inputs and outputs, inverse bind matrices) MUST use little endian byte order.

UV map

https://docs.blender.org/manual/ja/dev/addons/import_export/scene_gltf2.html#uv-mapping

KHR_texture_transform

Animation

three-vrm example の humanoidAnimation のデモがデバッグに使えそう

実装

github.com

とりあえずVRMをglTFとして読み込んだら、テクスチャ付きでprimitive単位に分割して再出力することはできた。

また気力が湧いたら続きをやろう。

2022年の振り返り

例年通り、今年あったことの概要をまとめておく。

1月

3Dプリンターをお買い上げしてた(今年だったんだ…)

ちなみにブログ記事も書いた

hikalium.hatenablog.jp

2月

3Dプリンタメンガーのスポンジを印刷してた(筆記用具は商品には含まれません)

そしてhikaliumとして初の社のイベント登壇をした

そしてもう一台3Dプリンタが増えた(錯乱)

戦争とかが始まったのもこのあたりらしい(世も末ですな)

あまりにも眠れなさすぎる現状を歌にするなどした(かっとしてつい…聴かなくていいですよ!!!)

3月

情報処理学会のOS研究会で社の仮想ブースを回すなどしていた

新しいお友達もお迎え(コアスイッチとして現在も頑張ってくれています)

おうちNOC業の様子

車輪を再発明した(車輪ではなく車(輪がついた物体の進入を防ぐ)輪)

技術的な方法でTwitterの閲覧時間を削減する試みを開始(まあまあ役に立っており、今もつかっている)

4月

社の公式ブログでお仕事に関する記事を書いた

Redox を読む会を始めた(次回をスケジュールするのを忘れていました…来年やります!)

セキュキャンのCコンパイラゼミが、元受講生の講師を迎えて再始動することが決定(本当にめでたかった!)

ZOZOMATを試すなど(足、印刷しなきゃ…)

ちなみにイエベ春らしいです(ZOZOGLASS曰く)

社のイベントで人々に自作OSはいいぞ!をするなどした

スライドはここ

そして Asahi Lina さんとコラボした!(Linaさん、つよつよなので尊敬している)

Linaさんのチャンネルにお邪魔して、私が自作OS語りをしてくる回もありました!

5月

kurenaif魔女のチャンネルにKOBA789氏と一緒にお邪魔して、DirtyPipe ( CVE-2022-0847 )を完全理解した

そして弊チャンネル初のSuperThanks受領(ありがとうございます!)

思い立ったのでosdev-jpのcode of conductを制定するなどした

2月に公開した歌の解説記事を書いた(解説の必要な歌って、なに?)

3Dプリンタがあるなら、ということで3Dスキャナに入門した(むずかしい)

USB Type-C の電気的な側面の理解を試みるなどした(少し理解した)

そして!はじめての!オフィスでの!夕食!(入社2年半以来初の快挙)

分解衝動の発散

6月

計算資源が追加された

ふるさと納税メロンを摂取(ひとりで2個まるごと食べるのはなかなかの難易度だった…超美味しかったけど…)

ついにToDoリストアプリをつくるというToDoに着手(現在メンテ中で落ちてる)

7月

Rust for Linuxでお遊びする配信をするなどした

[大人の]科学を大人買いするなど

そしてRP2040を飛ばす

そして破壊衝動の発散(ではなく異音の原因を除去した)

ちゃんと原因特定している図

他の物体も分解(分解ばっかりしてるな)

Optaneはもうおしまいです、わたしは悲しいよ…(終わらせないぞ!!!)

活版印刷入門

8月

夏はやっぱりセキュキャン!自作OS!だよね!!

あと電源は大事です。電源は大事なので。

インターンの人々の優しい言葉に救われました。本当にありがとうございます!!!

そして深淵を覗く

9月

はじめての入院入門!

ハードウェアアップデートのためしばらくオフラインに

生還したので辞世の句にはならなかった歌ってみた動画

2週間の入院後なんとか帰宅したら家は無事ではなかった話(またエアコンから水かよ(自力でなんとかしました))

リコリコに影響されて「力」を手に入れるなど(もちろん合法な力です)

ikaliumです(入院中に発売されていたスプラ3に入門)

10月

低レイヤーガール、チャンネル登録者数4000人突破!!(ありがとうございます!)

二次元セルオートマトンを一発実装する THE FIRST CODE をやってみたら、しょうもないコンパイルエラーで終了した件(ちゃんと後でデバッグしました!)

そして新しい物理アバターのmetrics exporter(丸くてかわいいのでお気に入りです)

久々に物理世界のイベントに参加して自己肯定感が向上した図(hikaliumは優しい皆様に救われています)

11月

情報公開(伏線回収)

やさしい世界

そしてDNSの浸透

3年間お預けだった、リアルワールド開催のSTEP Class 8に参加してきた!(mallocチャレンジの参加者の何名かに賞を差し上げました!)

テプラSR5900Pのプロトコルを解析して、CLIから印刷できるツールを実装した

物質、いいよね(用法用量を守って正しく使いましょう)

12月

ポケモンSV、はじめました!

Open Source Summit 聴講(社の人間としては初の物理カンファレンス参加)

WebUSBに入門した(自作OSでドライバ実装したときの大変さに比べたらマジで拍子抜けするほど簡単でびっくりした、みんなもっとこれで遊ぼう!)

/sys/hikalium/tracing を生やした(デバッグ用なのでノイズが多いですが興味あればどうぞ)

hikalium.hatenadiary.jp

胸に刻んでおきたい言葉(手前味噌ですが)

hikaliumのロゴの背後の深層心理はこれでは?という発見

no (クリスマス) spanning-tree

大掃除

著者近影

総括

振り返ってみれば、想像以上にたくさんのことをやっていたことに気づいた。もっと自信を持って欲しい > 自分

ついに情報公開も果たしたが、誰もが何事もなく受け止めてくれて、人々の優しさを再確認した。これからは、以前にも増して、自分の「好き」をもっと大切にしてゆきたいと思う。(みなさんもぜひ、そうしてくださいね!)

おしごとに関しては、外から見える範囲のCommunity contributionをたくさんできたのは素晴らしかったし、これからも続けてゆきたいが、もっと強くなって技術的な成果のほうもさらに挙げてゆきたい。問題は、時間が足りないというところだが…(生き残りたい!!!)

あと、もう少し精神を安定させてゆきたいですね。もっと、ゆっくり、やっていこう。活動を抑え気味にしているつもりでも、これだけのことをできているのだから。

今年お世話になった皆様におかれましては、本当にありがとうございました。

来年以降も引き続き精進してまいりますので、hikaliumをどうかよろしくお願いいたします!!!

Rustで自作OSをしているときのデバッグ例 - syscall 命令と仲良くなりたい!後編

この記事は自作OS Advent Calendar 2022の18日目の記事です。前回のあらすじはこちら:

hikalium.hatenablog.jp

例外を吐いてるのはどこのどいつだぁ?

さて、前回の状況をおさらいすると、

  • 0x200fd0の命令がアドレス0x2000000000にアクセスしようとしてページフォルト(0xe)を発生させた。
  • ページフォルトを処理している最中に一般保護例外(0xd)が発生し、一般保護例外を処理中にもさらに一般保護例外が発生することで、順次スタックが食い潰されていった。
  • 例外ハンドラのスタックが枯渇し、0x3de4bed8にアクセスしようとした段階でページフォルトが発生した。これにより、ダブルフォルトが発生した。
  • ダブルフォルトハンドラ内で再度ページフォルトが発生した結果、トリプルフォルトとなってリセットがかかった。

というわけで、まずは最初のきっかけである 0x200fd0とかにある命令がどこのどいつかを特定することにしましょう。

まず、アプリのロード状況を確認します。OSのログを見ると、

Executable found: Elf { name: hello, data: @0x000000003e2d9000 } 
This ELF seems to be executable!
phdr_start: 64, phdr_entry_size: 56, num_of_phdr_entry: 5
type  : (rwx) = (101)
offset: 0x0000000000000000
vaddr : 0x0000000000200000
fsize : 0x0000000000001B64
vsize : 0x0000000000001B64
align : 0x0000000000001000

type  : (rwx) = (110)
offset: 0x0000000000001B68
vaddr : 0x0000000000202B68
fsize : 0x00000000000001C8
vsize : 0x00000000000001C8
align : 0x0000000000001000

load_region_start = 0x0000000000200000
load_region_end = 0x0000000000203000
load_region @ 0x000000003d233000
dst_range: 0x0000000000000000 - 0x0000000000001B64
dst_range: 0x0000000000002B68 - 0x0000000000002D30
run the code!
entry_point = 0x000000003d2332f0

というふうになっています。これはどういうことかというと…図示したほうがはやそうなので、お絵描きしました。

現在のアプリケーションのロードの様子

現在は手抜きをするために、アプリケーションとOSのメモリ空間を分けていないので、アプリの希望通りのメモリレイアウトではなく、相対位置を維持したまま、異なるアドレスにCodeとDataの両方をロードしているのでした。

さて、例外を発生させたメモリアドレス(0x200fd0)は、このロードされたコード(0x3d233000-0x3d234b64)の中…にありませんね…あれ?

…と思って状況をよくよく確認すると、どうもこのアドレスは、アプリがもともと予期していた、コード領域がロードされるべきアドレス範囲(0x200000-0x201b64)の中にあるようです…つまり、アプリケーションが正しく再配置可能ではなかった、もしくはローダーが仕事をサボっているせいで、正しく再配置できなかった、のいずれかの可能性であると考えられます。ちょっとアプリのバイナリのほうを確認してみましょう。

$ `brew --prefix binutils`/bin/objdump -d -C target/x86_64-unknown-elf/release/hello | grep -A 3 200fd0
0000000000200fd0 <<core::fmt::Arguments as core::fmt::Display>::fmt>:
  200fd0:       48 83 ec 38             sub    $0x38,%rsp
  200fd4:       48 8b 06                mov    (%rsi),%rax
  200fd7:       48 8b 76 08             mov    0x8(%rsi),%rsi
  200fdb:       48 8b 4f 28             mov    0x28(%rdi),%rcx

objdumpに-Cオプションをつけると、シンボルをデマングル(人間が読みやすい形式に変換)してくれるみたいで、Rustのシンボル名にも対応してるみたいです。ありがとうbinutils!

というわけでですね、この200fd0は、明らかにDisplay::fmtを呼び出しているコードで利用されていて、我々のprintln!のコードパスで通っていそうな雰囲気がひしひしと伝わってきます。

さて、これを呼び出している側のコードはどうなっているのでしょうか?rip相対のcallではこのようなことは起こり得ないので、レジスタ間接でのcallがDisplay::fmtへ制御を移そうとしているはずです。なので、レジスタ間接callを使っている人々をリストアップしましょう。

$ `brew --prefix binutils`/bin/objdump -d -C target/x86_64-unknown-elf/release/hello | grep -E -e 'call.*\*' -e ' <.*>:$' | grep 'call.*\*' -B 1
0000000000200860 <<core::panic::panic_info::PanicInfo as core::fmt::Display>::fmt>:
  200886:       41 ff 56 18             call   *0x18(%r14)
  2008bf:       ff 50 18                call   *0x18(%rax)
--
0000000000201030 <core::fmt::write>:
  2010b7:       ff 50 18                call   *0x18(%rax)
  201177:       ff 54 08 08             call   *0x8(%rax,%rcx,1)
  2011d8:       ff 50 18                call   *0x18(%rax)
  2011e9:       42 ff 54 35 08          call   *0x8(%rbp,%r14,1)
  20122f:       ff 51 18                call   *0x18(%rcx)
0000000000201250 <core::fmt::Formatter::pad_integral>:
  2013f1:       ff 55 20                call   *0x20(%rbp)
  20150a:       41 ff 55 20             call   *0x20(%r13)
  201557:       ff 55 18                call   *0x18(%rbp)
  201582:       41 ff 55 18             call   *0x18(%r13)
  2015aa:       41 ff 55 20             call   *0x20(%r13)
00000000002015d0 <core::fmt::Formatter::pad_integral::write_prefix>:
  2015f1:       41 ff 54 24 20          call   *0x20(%r12)
0000000000201630 <core::fmt::Formatter::pad>:
  2018ea:       41 ff 56 20             call   *0x20(%r14)
  20190d:       41 ff 56 18             call   *0x18(%r14)
  20193f:       41 ff 56 20             call   *0x20(%r14)

まあ…たぶんcore::fmt::writeですよね…きっとそうだ…

`brew --prefix binutils`/bin/objdump -d -C target/x86_64-unknown-elf/release/hello | grep '<core::fmt::write>:' -A 155 | grep -z -E -e 'call' --color='always'

qemu/target/i386/cpu.h

$ cat qemu_debug.log | grep hikalium | head -n 3
hikalium: raise_interrupt2: is_int == 0 intno = 14 eip=0x000000000000200FD0 error_code = 0x000000000000000000
hikalium: rsp: 00000000003E286BE0
hikalium: ret_to: 00000000003D2341EE
$ cat com2.log | grep -a -e entry_point
entry_point = 0x000000003d2332f0
$ make objdump_hello | grep '<entry>:'
00000000002002f0 <entry>:
$ ./scripts/debug/inspect_app_crash.sh 
0000000000201030 <core::fmt::write>:
  2011e9:       42 ff 54 35 08          call   *0x8(%rbp,%r14,1)
  2011ee:       84 c0                   test   %al,%al

.data.rel.roがあやしい!

https://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/specialsections.html

Chromium Docs - Native Relocations

Relative relocations and RELR | MaskRay

$ `brew --prefix binutils`/bin/objcopy -O binary --only-section=.data.rel.ro generated/bin/hello data.bin
[00:34:16]
[local] hikalium@t05.z01.hikalium.com: ~/repo/wasabi  
$ hexdump -C data.bin 
00000000  58 01 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |X. .............|
00000010  58 01 20 00 00 00 00 00  01 00 00 00 00 00 00 00  |X. .............|
00000020  58 01 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |X. .............|
00000030  e0 04 20 00 00 00 00 00  08 00 00 00 00 00 00 00  |. .............|
00000040  08 00 00 00 00 00 00 00  20 06 20 00 00 00 00 00  |........ . .....|
00000050  f0 04 20 00 00 00 00 00  c0 05 20 00 00 00 00 00  |. ...... .....|
00000060  60 01 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |`. .............|
00000070  60 01 20 00 00 00 00 00  01 00 00 00 00 00 00 00  |`. .............|
00000080  61 01 20 00 00 00 00 00  08 00 00 00 00 00 00 00  |a. .............|
00000090  60 01 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |`. .............|
000000a0  e0 04 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |. .............|
000000b0  01 00 00 00 00 00 00 00  70 07 20 00 00 00 00 00  |........p. .....|
000000c0  b0 03 20 00 00 00 00 00  80 04 20 00 00 00 00 00  |. ....... .....|
000000d0  e0 04 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |. .............|
000000e0  01 00 00 00 00 00 00 00  70 19 20 00 00 00 00 00  |........p. .....|
000000f0  94 01 20 00 00 00 00 00  13 00 00 00 00 00 00 00  |.. .............|
00000100  37 00 00 00 05 00 00 00  94 01 20 00 00 00 00 00  |7......... .....|
00000110  13 00 00 00 00 00 00 00  53 00 00 00 05 00 00 00  |........S.......|
00000120  db 01 20 00 00 00 00 00  01 00 00 00 00 00 00 00  |. .............|
00000130  dc 01 20 00 00 00 00 00  03 00 00 00 00 00 00 00  |. .............|
00000140  a8 02 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |. .............|
00000150  a8 02 20 00 00 00 00 00  01 00 00 00 00 00 00 00  |. .............|
*
00000170  40 1a 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |@. .............|
00000180  01 00 00 00 00 00 00 00  50 08 20 00 00 00 00 00  |........P. .....|
00000190  b8 02 20 00 00 00 00 00  00 00 00 00 00 00 00 00  |. .............|
000001a0  b8 02 20 00 00 00 00 00  02 00 00 00 00 00 00 00  |. .............|
000001b0

https://uclibc.org/docs/elf-64-gen.pdf

Hardening ELF binaries using Relocation Read-Only (RELRO)

https://maskray.me/blog/2021-08-29-all-about-global-offset-table

Airs – Ian Lance Taylor » Linker relro

cnlelema.github.io

時間切れ

というわけで追いかけていたら.data.rel.roの沼にはまったので今日はここまで。明日もやるかも。おやすみなさい…。