Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
バイナリダンプの模様を読む
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Satoru Takeuchi
PRO
July 01, 2026
Technology
85
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
バイナリダンプの模様を読む
以下動画のスライドです
https://youtu.be/0coXcaoMSjw
Satoru Takeuchi
PRO
July 01, 2026
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
119-多機能ファイルシステムBtrfs_のコピー.pdf
sat
PRO
1
47
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
75
あなたの知らないバージョン命名規則
sat
PRO
2
850
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
61
Machine Check Exception
sat
PRO
2
57
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
79
114-ファイルのshallow_copy.pdf
sat
PRO
2
48
113-Btrfsのスナップショット.pdf
sat
PRO
0
36
システム強制終了時にファイルシステムの整合性を保つ~ コピーオンライト編 ~
sat
PRO
0
71
Other Decks in Technology
See All in Technology
AI時代の「OAuth認証」にどう物申すか?(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
340
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
77k
markdown-poster Introduction
kazamori
0
400
AI時代のデータ基盤を考える問い
pacocat
0
740
OpenID for Verifiable Credentials 実装から見えた相互運用性確保までの道のり(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
When Token Pruning is Worse than Random: Understanding Visual Token Information in VLLMs
sansantech
PRO
0
130
パスキーでドライブする アカウント統合(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
360
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
12
86k
dbt in Microsoft Fabric
ryomaru0825
0
300
Kiro Crew で始める マルチエージェント開発
miu_crescent
PRO
0
200
Oracle AI Databaseデータベース・サービス: BaseDB/ExaDB-Dの可用性
oracle4engineer
PRO
1
960
500名弱規模の組織のPythonプロジェクト(dbt) をどう管理するか?
hiracky16
0
360
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
240
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
290
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Building the Perfect Custom Keyboard
takai
2
850
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
BBQ
matthewcrist
89
10k
Transcript
バイナリダンプの模様を読む Jul. 2nd, 2026 Satoru Takeuchi X: satoru_takeuchi 1
• 任意のデータを数値や文字として出力したもの • 人間が与えた意味(どのオフセットどんなデータがあるとか)をツールが解釈せず、 データをただのバイト列という形で読むためのもの • 使用例 ◦ データが期待通りのかたちでバイト列に変換されているかの確認 ◦
データ破壊が起きた場合の調査 ◦ 何を意味しているのか分からないデータの解析 バイナリダンプとは 2
文字列データのバイナリダンプ 3 $ cat hello.txt Hello, world! $ xxd hello.txt
00000000: 4865 6c6c 6f2c 2077 6f72 6c64 210a Hello, world!. $
画像データ(png)の先頭部分 4 $ xxd -l 64 niconico.png 00000000: 8950 4e47
0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 00000010: 0000 0058 0000 0050 0806 0000 009d c6b2 ...X...P........ 00000020: 5900 0000 0173 5247 4200 aece 1ce9 0000 Y....sRGB....... 00000030: 0004 6741 4d41 0000 b18f 0bfc 6105 0000 ..gAMA......a… $
ランダムデータの場合 5 $ dd if=/dev/random of=random.data bs=64 count=1 … $
xxd random.data 00000000: 2f5c 7530 7953 159a 4e13 516b a5be 618c /\u0yS..N.Qk..a. 00000010: d012 9c19 a8b8 ef57 dcdc ea85 4b86 fa80 .......W....K... 00000020: 1a45 9e84 bed4 38dd 93f2 17d0 a2aa 5d1d .E....8.......]. 00000030: 84f7 7fbb 8f74 734a 19e1 f754 1632 2e26 .....tsJ...T.2.& $
バイナリダンプの模様 • 同じような形式のバイナリダンプを眺め続けると次第に浮かんでくるもの ◦ バイナリダンプのどこにどんなデータがあるかが識別できる • 正式に定義された言葉ではない ◦ たぶん「目grep」という言葉のほうが有名 •
📝 メモリダンプと模様が見える男 ◦ https://note.com/hkamezawa/n/na4a01c712142 6
わたしが見える模様を実例として紹介 • Linuxカーネルのプロセスのスタックをバイナリダンプしたときに見える模様 ◦ スタックは関数呼び出し履歴やローカル変数などコンテキストを保存する領域 ◦ Linuxカーネルはプロセス (正確にはスレッド)ごとにスタックが存在する • 例えばどういうときに読むか
◦ Linuxカーネルに問題が発生して異常終了した (Windowsでいうブルースクリーン )ときにkdumpと言 うツールでシステムのメモリを全てファイルにダンプする ◦ 再起動後に、そのファイルを crashなどのツールを使って解析する ▪ 📝 その80 動作中にLinux環境の全メモリを見る ◦ 解析の一環としてプロセスのカーネルスタックをバイナリダンプして読むことがある • カーネル: Ubuntu 24.04同梱のLinux v6.8.0-117-generic • ややこしい話なので完全理解しようとせずフィーリングで観てほしい 7
状況 • ファイルコピーなどに使うddコマンドがwriteシステムコール呼び出しの延長で長時 間戻ってこない状態になる ◦ SIGKILLでも殺せない、いわゆる D state • その後システムが異常終了
• 異常終了に上記プロセスが関わっているかを知りたい ◦ 📝 わかりやすさのために通常の調査の流れと変えているところが多々あります 8
ddのスタックのバイナリダンプの抜粋 • スタックが0xffffd137cbfd8000から16KiBだとする 9
ぐっとにらむと模様が見える 10
ぐっとにらむと模様が見える 11 • プロセスごとに存在するアーキテクチャ依存の情報を保持する thread_infoという構造体へのポインタ • スタックの頂上(最低位アドレス)に置くことが決まっている
ぐっとにらむと模様が見える 12 • システムコールを呼び出し時のシステムコールおよびレジスタの値 (ピンクの部分) • CPU、およびentry_SYSCALL_64_after_hardwareが • スタックの底(最高位アドレス)から数十バイトに積むことが決まっている
ぐっとにらむと模様が見える 13 • entry_SYSCALL_64_after_hwframeからdo_syscall_64を呼んだ際の戻りアドレス • CPUのCALL命令を呼んだら自動的に積まれるようになっている
ぐっとにらむと模様が見える 14 • do_syscall_64のスタックフレーム(ローカル変数などが入る領域 )へのポインタ • カーネルのビルド設定 CONFIG_FRAME_POINTERが有効ならこうすると決まっている do_syscall_64から何らかの関数を呼んだときの戻りアドレス
ぐっとにらむと模様が見える 15 do_syscall_64から何らかの関数を呼んだときの戻りアドレス • do_syscall_64のスタックフレーム(ローカル変数などが入る領域 )へのポインタ • カーネルのビルド設定 CONFIG_FRAME_POINTERが有効ならこうすると決まっている •
スタックフレームのポインタらしきものとコードのアドレスらしきものが並んでいれば関数呼び 出しと、その後に呼ばれる呼び出し元のスタックフレームのアドレスが並んでいると推測できる • どのアドレスがどこの領域のものかはルールが決まっている ◦ https://github.com/torvalds/linux/blob/v6.8/Documentation/arch/x86/x86_64/mm.rst
ぐっとにらむと模様が見える 16 前述のルールに従うとこのデータ (0xffff8dc8105a5840)も恐らくカーネ ル内のコード or データであろうことがわかる
ぐっとにらむと模様が見える 17 • schedule関数からプロセスをスリープさせる __scheduleを呼んだ時の戻りアドレス • プロセスのスリープ前に呼ぶ関数は schedule → __scheduleなので、スタックフレームをこれ
以上先にたどれないときは、これらが最後 2つの関数だと推測できる
重要なポイント • 一種の覚えゲーである ◦ データのバイトオフセットやデータのパターンは何らかの仕様で決まっていることが多い • できると万能感と多幸感がある • たくさん同じようなデータを眺めていれば自然とできるようになる ◦
できる人は天才とかそういうことはない ◦ どこまで模様が鮮明なのかは人による • 普通はできなくても困らず、だいたいは楽できるコマンドがある ◦ 例: crashでスタックを見るにも関数呼び出し履歴を出力する btコマンド • 稀にバイナリダンプが最後の望みの綱ということがある 18
まとめ • バイナリダンプを眺めていると模様が浮かぶことがある ◦ 目grepができる、とも表現する • 模様が浮かぶと便利だが、いつも必要というわけではない • 慣れると誰でもできるが鮮明度は人それぞれ •
できるとかっこいいので、興味があればフォーマットが決まっている適当なバイナリ ダンプを何十個か眺めてみてほしい 19