CINXE.COM
O'Reilly Japan - Binary Hacks Rebooted
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>O'Reilly Japan - Binary Hacks Rebooted</title> <link rel="stylesheet" type="text/css" href="/assets/css/font-face.css"> <link rel="stylesheet" type="text/css" href="/assets/css/layout.css"> <link rel="stylesheet" type="text/css" href="/assets/css/layout-books.css"> <link rel="icon" type="image/png" href="https://www.oreilly.com/favicon.ico"> <meta name="format-detection" content="telephone=no"> <meta property="og:title" content="Binary Hacks Rebooted" /> <meta property="og:type" content="article" /> <meta property="og:image" content="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0085-0.jpeg" /> <meta property="og:image:secure_url" content="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0085-0.jpeg" /> <meta property="og:url" content="https://www.oreilly.co.jp/books/9784814400850/" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="O'Reilly Japan" /> <meta name="twitter:creator" content="oreilly_japan" /> <link href="http://www.oreilly.co.jp/sales/atom.xml" type="application/atom+xml" rel="alternate" title="Sales Information" /> <meta property="og:description" content="本書は低レイヤのプログラミングに関するHack集であり、2006年に発行された『Binary Hacks』の再構築版として書かれました。低レイヤとは抽象化の度合いが低く計算機と近いレイヤのことを指し、またHackとは巧妙な方法で問題を解決する手法を指します。現代のコンピュータシステムは重層的です。抽象化のレイヤを重ねることで発展し、無数の機能が実現されています。これらのレイヤは巧みに設計されているため、機能を利用するだけなら各レイヤの動作を詳細に知る必要はありません。それでも私たちは時折、抽象化レイヤを剥がしてシステムの中身を見る必要に駆られます。これは抽象化そのもののメカニズムや、抽象化によって隠蔽されてしまった機能を利用したいことがあるからです。また、何より抽象化レイヤそのものや、その下側を覗いてみるのはとても楽しいことです。今まで開発者たちが積み上げてきた1つ1つの部品やその組み合わせの中には、常に新しい発見があります。この本はそんな低レイヤの世界を探検するためのさまざまな入口―Hackを89(ハック)個提供します。(「はじめに」より)" /> <link rel="canonical" href="https://www.oreilly.co.jp//books/9784814400850/" /> <link rel="amphtml" href="https://www.oreilly.co.jp//books/9784814400850/mobile.html"> <!-- Google Tag Manager --> <script>(function (w, d, s, l, i) { w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); var f = d.getElementsByTagName(s)[0], j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true; j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; f.parentNode.insertBefore(j, f); })(window, document, 'script', 'dataLayer', 'GTM-KR9JFVC');</script> <!-- End Google Tag Manager --> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-M7QE72H4KS"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-M7QE72H4KS'); </script> <style> .collapsible { background-color: white; border: 0; border-bottom: 1px solid rgb(246, 246, 246); margin: 0; padding: 0; cursor: pointer; width: 100%; text-align: left; outline: none; font-size: 1.5rem; font-weight: 700; line-height: 1.5em; } .collapsible:after { content: '\02795'; /* Unicode character for "plus" sign (+) */ font-size: 1.0rem; margin-left: 5px; float: right; } .collapsible-active:after { content: "\2796"; /* Unicode character for "minus" sign (-) */ } .collapsible:hover { box-shadow: 2px0 4px 8px rgb(0, 0, 0, .1); transition: box-shadow .2s; cursor: pointer; } .collapsible+section { padding: 0; margin-bottom: 30px; background-color: white; max-height: 0; overflow: hidden; transition: max-height 0.05s ease-out; } </style> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KR9JFVC" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div id="skipToMain" class="nav__SkipToMain"><a href="#maincontent">Skip to main content</a></div> <header role="banner" class="nav__GlboalHeader"> <div class="pageWidth"> <nav role="navigation" aria-label="site sections" class="nav__GlobalNav"> <a aria-current="page" title="Go to home page" class="nav__Logo" href="/"><img src="/assets/images/logo_oreilly_japan.svg" alt="O'Reilly logo"></a> <div class="nav__NavItems" id="nav__NavItems"> <div class="nav__NavGroup"> <a class="nav__Link" href="/blog/">Blog</a> <a class="nav__Link active" href="/catalog/">Books</a> <a class="nav__Link" href="/ebook/">Ebooks</a> <a class="nav__Link" href="/online-learning/">Learning platform</a> <a class="nav__Link" href="/order/">Order</a> <a class="nav__Link" href="/company/">About</a> </div> <div class="nav__CTA"> <a href="/ebook/cart" class="nav__Cart">Cart</a> </div> </div> <button id="nav__MobileBtn" aria-expanded="false" aria-controls="menuList" class="nav__MobileBtn"><span><span></span></span></button> </nav> </div> </header> <main id="maincontent"> <div class="pageWidth"> <h1 itemprop="name"> Binary Hacks Rebooted </h1> <p class='sub_title'> ―低レイヤの世界を探検するテクニック89選</p> <span itemprop="publisher" content="オライリー・ジャパン"></span> <div class="contributers"> <span itemprop="author"> 河田 旺、小池 悠生、渡邉 慶一、佐伯 学哉、荒田 実樹 著、鈴木 創、中村 孝史、竹腰 開、光成 滋生、hikalium、浜地 慎一郎 寄稿 </span> </div> <section class="detail" itemscope itemtype="http://schema.org/Book"> <div class="detail-cover"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0085-0.jpeg" class="cover-photo" alt="[cover photo]" /> </div> <dl class="item-props"> <dt>TOPICS</dt> <dd> <a href="/books/prog/"> Programming </a> </dd> <dt>発行年月日</dt> <dd itemprop="datePublished" content="2024-08-28"> 2024年08月 </dd> <dt>PRINT LENGTH</dt> <dd itemprop="numberOfPages"> 660 </dd> <dt>ISBN</dt> <dd itemprop="isbn"> 978-4-8144-0085-0 </dd> <dt>FORMAT</dt> <dd> Print PDF EPUB <div class="buying-options"> <div class="option-item"> <div class="option-name">Ebook</div> <div> 4,400円 </div> <a href="/ebook/cart?id=978-4-8144-0085-0&mode=add" class="update-button secondary-button"> Ebookを購入する </a> </div> <div class="option-item"> <div class="option-name">Print</div> <div> 4,400円 </div> <div class="link-book-order">書籍のご注文は<a href="https://www.ohmsha.co.jp/book/9784814400850/">オーム社サイト</a>へ </div> </div> </div> </dd> </dl> <div id="detail" class="content"> <p itemprop="description"> 本書は低レイヤのプログラミングに関するHack集であり、2006年に発行された『<a href="https://www.oreilly.co.jp/books/9784873112886/">Binary Hacks</a>』の再構築版として書かれました。低レイヤとは抽象化の度合いが低く計算機と近いレイヤのことを指し、またHackとは巧妙な方法で問題を解決する手法を指します。現代のコンピュータシステムは重層的です。抽象化のレイヤを重ねることで発展し、無数の機能が実現されています。これらのレイヤは巧みに設計されているため、機能を利用するだけなら各レイヤの動作を詳細に知る必要はありません。それでも私たちは時折、抽象化レイヤを剥がしてシステムの中身を見る必要に駆られます。これは抽象化そのもののメカニズムや、抽象化によって隠蔽されてしまった機能を利用したいことがあるからです。また、何より抽象化レイヤそのものや、その下側を覗いてみるのはとても楽しいことです。今まで開発者たちが積み上げてきた1つ1つの部品やその組み合わせの中には、常に新しい発見があります。この本はそんな低レイヤの世界を探検するためのさまざまな入口―Hackを89(ハック)個提供します。(「はじめに」より) </p> </div> <h2 class="collapsible">正誤表</h2> <section> <p> ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。 </p> <h3> 第1刷正誤表 </h3> <div class="errata"> 2024年9月更新<br> <br> ■p.22 本文9行目<br> 【誤】Position Indepent Code<br> 【正】Position Independent Code<br> <br> ■p.303 「Python連携」の直前の本文<br> 【誤】undispコマンド<br> 【正】undisplayコマンド<br> <br> </div> </section> <h2 class="collapsible">目次</h2> <section> <div id="toc"> <pre>本書に寄せて クレジット はじめに 1章 イントロダクション #1 未知のバイナリの読み方 #2 アセンブリ入門 #3 Hello, World!再訪 2章 ELF Hack #4 ELFファイルのセグメント #5 ld-linux.soの環境変数を利用する #6 共有ライブラリを検索するディレクトリ #7 dlopenによるライブラリの実行時ロードとその応用テクニック #8 IFUNCを使って実行時に実装を切り替える #9 ELFのハッシュテーブルのしくみ #10 TLSのしくみを理解する #11 コアファイルを読む #12 補助ベクトルを使ってプロセスに情報を渡す #13 静的リンクとASLRの関係 #14 soldを使って依存する共有ライブラリを後からリンクする #15 glibcをHackする #16 patchelfでELFバイナリのフィールドを書き換える #17 LIEFを使ってELFバイナリを書き換える #18 PT_NOTEを利用したバイナリパッチ #19 DWARF Expressionを実行する:DWARFⅠ #20 DWARFで数式を評価する:DWARFⅡ #21 DWARFで標準出力に出力する:DWARFⅢ 3章 OS Hack #22 実行可能ファイルとその起動方法 #23 LinuxでHuge Pageを使う #24 CRIUを使ってプロセスを保存、再開する #25 procfs / sysfsの基本を把握する #26 用途に合わせたファイルシステムを選ぶ #27 特定のプロセスに見せるファイルを差し替える #28 FUSEを使ってファイルシステムを自作する #29 特殊なメモリ領域vsyscallとvDSO #30 KVMを使ってハイパーバイザを作成する #31 LinuxカーネルHack入門 #32 Unikernel:アプリケーションをOSとして動かす #33 UEFIとSecure Boot #34 GNUツールチェインで機械語ファイルを出力する #35 QEMU上で動くファームウェアを作る #36 Chromebook上で自作のファームウェアを動かす 4章 コンテナHack #37 Linuxネームスペースでプロセスを分離する #38 cgroupでプロセスのリソースを管理する #39 chroot/pivot_rootでルートディレクトリを切り替える #40 一般ユーザーがrootのように振る舞う方法3選 #41 rootlessコンテナの使い方とそのしくみ #42 ユーザーネームスペース内で各種のネームスペースを作成する #43 /proc/PID/rootからコンテナ内のファイルに直接アクセスする 5章 デバッガ・トレーサHack #44 gdb Tips #45 rrを使ってRecord and Replayデバッグを行う #46 サニタイザで低レイヤのバグを見つける:サニタイザⅠ #47 Address Sanitizerのしくみ:サニタイザⅡ #48 Linuxパフォーマンス解析ことはじめ #49 ftraceを使ってカーネル内で起こっていることをトレースする #50 eBPFを使ったトレーシング入門 #51 DBIで実行命令をトレース・改変する #52 Intel PTで高速にトレースを取得する 6章 セキュリティHack #53 seccompでプロセスの使えるシステムコールを制限する #54 Landlockで非特権プロセスサンドボックスを作る #55 ASLR:不正なメモリアクセスに対するセキュリティ機構 #56 ROP:メモリ破壊を悪用するスタンダードな攻撃手法 #57 Intel CET:ROPに対するセキュリティ機構 #58 Clang CFIによって不正な制御フローを検知する #59 スタックフレームの変化を観察する #60 ファジングの概要と分類 #61 グレイボックスファジングでバグや脆弱性を探す #62 LibAFLでファザーを実装する #63 LibAFLで実装したファザーを改良する #64 angrでシンボリック実行する #65 BadUSB:使用者を騙すUSBデバイス #66 Row Hammer:DRAMの脆弱性に対する攻撃手法 #67 MeltdownとSpectre:CPUの脆弱性に対する攻撃手法 7章 数値表現とデータ処理Hack #68 整数表現の基礎知識 #69 さまざまな整数表現 #70 浮動小数点数のビット列表現を理解する #71 浮動小数点例外 #72 浮動小数点数の丸め方を変える #73 浮動小数点環境を触るコードに対するコンパイラの最適化と戦う #74 NaNを深掘りする #75 浮動小数点数のアーキテクチャごとの差異に触れる #76 SIMD命令セットの基礎知識 #77 SIMD並列化したコードを書く #78 SIMD命令を使ったさまざまなテクニック 8章 言語処理系Hack #79 NaNを活用して64ビット値にタグ付きの値を格納する #80 ucontext.hでコルーチンを実装する #81 Profile Guided Optimization #82 LD_PRELOADを使ってメモリアロケータを入れ替える #83 ABIと呼び出し規約を理解する #84 libffiで実行時までシグネチャがわからない関数を呼び出す #85 実行時に機械語を生成する #86 GCC/Clangの組み込み関数を利用する 9章 そのほかのHack #87 用語集 #88 Binary Hacksに必要なツール #89 文献案内 索引 </pre> </div> </section> </section> <div class="related-items"> <div class="sectionRow__Heading"> <h3>関連書籍</h3> </div> <div class="sectionRow__Content"> <div class="sectionRow__BestLarge" id="bestEbooks"> <div class="sectionRow__Best" id="bestEbook1"> <a class="sectionRow__BestCover" href="/books/9784873112886/"> <img src="https://www.oreilly.co.jp/books/images/picture_large4-87311-288-5.jpeg" alt="Binary Hacks"> </a> </div> <div class="sectionRow__Best hidden" id="bestEbook2"> <a class="sectionRow__BestCover" href="/books/9784814400874/"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0087-4.jpeg" alt="コンピュータシステムの理論と実装 第2版"> </a> </div> <div class="sectionRow__Best hidden" id="bestEbook3"> <a class="sectionRow__BestCover" href="/books/9784814400799/"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0079-9.jpeg" alt="脳に収まるコードの書き方"> </a> </div> <div class="sectionRow__Best hidden" id="bestEbook4"> <a class="sectionRow__BestCover" href="/books/9784814400416/"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0041-6.jpeg" alt="ルールズ・オブ・プログラミング"> </a> </div> </div> <div class="sectionRow__BestThumbnails" id="bestEbookThumbnails"> <button class="sectionRow__bestBookThumbnailsItem" data-for="bestEbook1" aria-selected="true" title="Binary Hacks"> <img src="https://www.oreilly.co.jp/books/images/picture_large4-87311-288-5.jpeg" alt="94540429697304"> </button> <button class="sectionRow__bestBookThumbnailsItem" data-for="bestEbook2" title="コンピュータシステムの理論と実装 第2版"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0087-4.jpeg" alt="94540438830208"> </button> <button class="sectionRow__bestBookThumbnailsItem" data-for="bestEbook3" title="脳に収まるコードの書き方"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0079-9.jpeg" alt="94540442652424"> </button> <button class="sectionRow__bestBookThumbnailsItem" data-for="bestEbook4" title="ルールズ・オブ・プログラミング"> <img src="https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0041-6.jpeg" alt="94540445206904"> </button> </div> </div> </div> </div> </main> <footer class="footer__FooterSection"> <div class="pageWidth"> <div class="footer__FooterTop"> <div class="footer__List"> <h3><a href="https://www.oreilly.co.jp/company/">About</a></h3> <a href="https://www.oreilly.co.jp/company/">会社概要</a> <a href="https://www.oreilly.co.jp/orj/privacypolicy.shtml">個人情報について</a> <a href="http://www.oreilly.com/">O’Reilly Media</a> <a href="http://makezine.jp/">Make: Japan</a> <a href="http://makezine.jp/events">Maker Faire Tokyo</a> </div> <div class="footer__List"> <h3><a href="https://www.oreilly.co.jp/company/">Support</a></h3> <a href="https://www.oreilly.co.jp/feedback/">Contact us</a> <a href="https://www.oreilly.co.jp/bookclub/">Bookclub</a> <a href="https://www.oreilly.co.jp/order/">書籍注文</a> </div> <div class="footer__Apps"> <h3>Download the O’Reilly app</h3> <p>Take O’Reilly with you and learn anywhere, anytime on your phone <span class="nowrap">and tablet.</span> </p> <div class="footer__DownloadLinks"> <a href="https://itunes.apple.com/us/app/safari-to-go/id881697395"><img src="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png" alt="Apple app store"></a> <a href="https://play.google.com/store/apps/details?id=com.safariflow.queue"><img src="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png" alt="Google play store"></a> </div> </div> </div> <div class="footer__FooterBase"> <a aria-current="page" class="footer__Logo" title="Go to home page" href="/"><img src="/assets/images/logo_oreilly_japan.svg" alt="O'Reilly logo"></a> <p>© 2022, O’Reilly Japan, Inc. oreilly.co.jpに掲載されているすべてのトレードマークおよび登録商標は、それぞれの所有者に帰属します。</p> </div> </div> </footer> <script src="/assets/scripts/cookies-policy.6d8dcbae.js"></script> <script> let coll = document.getElementsByClassName('collapsible'); for (let i = 0; i < coll.length; i++) { let button = document.createElement('button'); button.setAttribute('type', 'button'); button.setAttribute('class', 'collapsible'); button.textContent = coll[i].textContent; coll[i].replaceWith(button) coll[i].addEventListener('click', function () { this.classList.toggle('collapsible-active'); let content = this.nextElementSibling; if (content.style.maxHeight) { content.style.maxHeight = null; } else { content.style.maxHeight = content.scrollHeight + 'px'; } }); } </script> <script src="/assets/scripts/scripts.js"></script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-6009404-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-6009404-1'); </script> </body> </html>