SlideShare a Scribd company logo
1 of 13
自動でバグを見つける!
プログラム解析と動的バイナリ計装
カジュアルTechスシ
2020年5月28日
サイボウズ・ラボ株式会社 内田公太
1
/13
自己紹介
• 研究員 at サイボウズ・ラボ
• サイボウズ本社に2014年新卒入社
• Hazama→SRE
• 2020年1月にラボへ転籍
• カフェ部(酒)担当
• 紅茶も好きです
2
/13
研究分野
• 計算機科学の教育
• 「OSを作る」ことを通してCS教育
• 教育用OS「MikanOS」の作成
• プログラム解析
• プログラムの動作を調べる
• バグを見つける
• 今日の主題
3
/13
バッファーオーバーフロー
• バッファーオーバーランとも
• 問題:次のプログラムに潜むバグを指摘せよ
(制限時間30秒)
int main() {
char* p = malloc(10);
for (int i = 0; i < 10; ++i) {
p[i] = '0' + i;
}
p[10] = '0';
printf("p = %sn", p);
}
4
/13
静的解析
• プログラムを動かさずに解析
• 代表的なツール:Lint
int main() {
char* p = malloc(10);
for (int i = 0; i < 10; ++i) {
p[i] = '0' + i;
}
p[10] = '0';
printf("p = %sn", p);
}
• pのヌルチェックをしていない
• pの末尾を超えて書き込んでいる
• pをfreeしていない
5
バッファーオーバーフロー
/13
malloc()の戻り値
10バイト
バッファーオーバーフロー
6
'0' '1' '2' '3' '4' '5' '6' '7' '8' '9' NUL
/13
動的解析
• プログラムを動かして解析
• 代表的なツール:GDB
• 実際の値で正確な検査ができる
• バイナリさえあれば動かせる
• マルウェアの解析
• ソースコードの情報は使えない
• この条件付きjmpはifかwhileか?
00000000004004a0 <main>:
4004a0: sub rsp,0x8
4004a4: mov edi,0xa
4004a9: call 400470 <malloc@plt>
4004ae: mov esi,0x400684
4004b3: mov BYTE PTR [rax],0x30
4004b6: mov BYTE PTR [rax+0x1],0x31
4004ba: mov BYTE PTR [rax+0x2],0x32
4004be: mov BYTE PTR [rax+0x3],0x33
…
7
/13
バイナリ計装(今日の主題)
• Binary Instrumentation
• 実行ファイルに検査コードを埋め込む
• 代表的なツール:Intel Pin
• 一般に,実行ファイルに機械語を埋め
込むとアドレスがずれる
• →再アセンブルが必要
• Intel Pinはそれをやってくれる
00000000004004a0 <main>:
4004a0: sub rsp,0x8
4004a4: mov edi,0xa
4004a9: call 400470
…
8
/13
DBIでバッファーオーバーフローを発見
• 動的バイナリ計装:実行時にバイナリ計装する
• 検出方針:
• mallocの引数と戻り値を記録しておき
• メモリアクセス時にアクセス先アドレスを検査
int main() {
char* p = malloc(10);
for (int i = 0; i < 10; ++i) {
p[i] = '0' + i;
}
p[10] = '0';
printf("p = %sn", p);
}
引数と戻り値を記録
メモリアクセスを検査
9
/13
自作解析ツールの出力
$ ../../../pin -t obj-intel64/MyPinTool.so -- ./a.out
===============================================
This application is instrumented by MyPinTool
===============================================
Found out-of-bounds memory write at f2f01a (IP=4004e2)
p = 0123456789
===============================================
MyPinTool analysis results:
Heap Objects:
f2f010: size=0xa
f2f030: size=0x400
===============================================
10
/13
自作解析ツールの出力
$ ../../../pin -t obj-intel64/MyPinTool.so -- ./a.out
===============================================
This application is instrumented by MyPinTool
===============================================
Found out-of-bounds memory write at f2f01a (IP=4004e2)
p = 0123456789
===============================================
MyPinTool analysis results:
Heap Objects:
f2f010: size=0xa
f2f030: size=0x400
===============================================
解析対象アプリの出力
11
/13
mallocを置き換える
0000000000400470 <malloc@plt>:
400470: jmp QWORD PTR [rip+0x200baa]
400476: push 0x1
40047b: jmp 400450 <_init+0x28>
…
もとのプログラム
検査用malloc
malloc()をラップ
サイズとアドレスを記録
RTN_ReplaceSignature()
Intel Pinの機能で関数置換
heap_objs
12
/13
メモリアクセスを検査
00000000004004a0 <main>:
4004a0: sub rsp,0x8
4004a4: mov edi,0xa
4004a9: call 400470 <malloc@plt>
…
4004da: mov BYTE PTR [rax+0x8],0x38
4004de: mov BYTE PTR [rax+0x9],0x39
4004e2: mov BYTE PTR [rax+0xa],0x0
4004e6: xor eax,eax
4004e8: call 400480 <__printf_chk@plt>
もとのプログラム
INS_MemoryOperandCount()
INS_InsertCall()
CheckOverflow()
指定した命令のメモリ参照の個数
指定した命令の直前に関数呼び出しを挿入
heap_objs
メモリアドレスが
範囲内であることを検査
13

More Related Content

What's hot

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話
Preferred Networks
 

What's hot (20)

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!CVE、JVN番号の取得経験者になろう!
CVE、JVN番号の取得経験者になろう!
 
FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話FastAPIのテンプレートプロジェクトがいい感じだった話
FastAPIのテンプレートプロジェクトがいい感じだった話
 
継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話
 
型安全性入門
型安全性入門型安全性入門
型安全性入門
 
flaws.cloudに挑戦しよう!
flaws.cloudに挑戦しよう!flaws.cloudに挑戦しよう!
flaws.cloudに挑戦しよう!
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
フィーチャモデルの描き方
フィーチャモデルの描き方フィーチャモデルの描き方
フィーチャモデルの描き方
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
 
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
 
[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース[NEDO特別講座] OSS活用のためのライセンス解説コース
[NEDO特別講座] OSS活用のためのライセンス解説コース
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 

Similar to 自動でバグを見つける!プログラム解析と動的バイナリ計装

IoTゴミ箱作って運用してみた.pptx
IoTゴミ箱作って運用してみた.pptxIoTゴミ箱作って運用してみた.pptx
IoTゴミ箱作って運用してみた.pptx
Yasuhira Chiba
 
Introduction of Swift from Machine Learning
Introduction of Swift from Machine LearningIntroduction of Swift from Machine Learning
Introduction of Swift from Machine Learning
Daisuke Yamashita
 

Similar to 自動でバグを見つける!プログラム解析と動的バイナリ計装 (20)

DevOps、その前に
DevOps、その前にDevOps、その前に
DevOps、その前に
 
モードレスな物理インターフェイスの実装(オフィス編)
モードレスな物理インターフェイスの実装(オフィス編)モードレスな物理インターフェイスの実装(オフィス編)
モードレスな物理インターフェイスの実装(オフィス編)
 
クライアント推し。
クライアント推し。クライアント推し。
クライアント推し。
 
IoTゴミ箱作って運用してみた.pptx
IoTゴミ箱作って運用してみた.pptxIoTゴミ箱作って運用してみた.pptx
IoTゴミ箱作って運用してみた.pptx
 
Bot Framework 最新情報 2018
Bot Framework 最新情報 2018Bot Framework 最新情報 2018
Bot Framework 最新情報 2018
 
[db analytics showcase Sapporo 2018] B32 無いなら作ろう!教師データ作成のあれこれ
 [db analytics showcase Sapporo 2018] B32 無いなら作ろう!教師データ作成のあれこれ [db analytics showcase Sapporo 2018] B32 無いなら作ろう!教師データ作成のあれこれ
[db analytics showcase Sapporo 2018] B32 無いなら作ろう!教師データ作成のあれこれ
 
チャットボットの自然言語処理
チャットボットの自然言語処理チャットボットの自然言語処理
チャットボットの自然言語処理
 
鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料鹿駆動勉強会 青江発表資料
鹿駆動勉強会 青江発表資料
 
Introduction of Swift from Machine Learning
Introduction of Swift from Machine LearningIntroduction of Swift from Machine Learning
Introduction of Swift from Machine Learning
 
元気にリモートワークを始める方法
元気にリモートワークを始める方法元気にリモートワークを始める方法
元気にリモートワークを始める方法
 
sitTokyo2022_Dev_05_Kawanabe.pptx
sitTokyo2022_Dev_05_Kawanabe.pptxsitTokyo2022_Dev_05_Kawanabe.pptx
sitTokyo2022_Dev_05_Kawanabe.pptx
 
業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日業務系WebアプリケーションがStrutsから旅立つ日
業務系WebアプリケーションがStrutsから旅立つ日
 
MISO20200530
MISO20200530MISO20200530
MISO20200530
 
Teams + Power Platform でチームメンバーの状況報告を圧倒的効率化!
Teams + Power Platform でチームメンバーの状況報告を圧倒的効率化!Teams + Power Platform でチームメンバーの状況報告を圧倒的効率化!
Teams + Power Platform でチームメンバーの状況報告を圧倒的効率化!
 
【アイディア止まり】Ozobotでデータサイエンス~天気予報ロボットを作ろう~
【アイディア止まり】Ozobotでデータサイエンス~天気予報ロボットを作ろう~【アイディア止まり】Ozobotでデータサイエンス~天気予報ロボットを作ろう~
【アイディア止まり】Ozobotでデータサイエンス~天気予報ロボットを作ろう~
 
.NET 7期待の新機能
.NET 7期待の新機能.NET 7期待の新機能
.NET 7期待の新機能
 
ガチリアルな修羅チーム開発
ガチリアルな修羅チーム開発ガチリアルな修羅チーム開発
ガチリアルな修羅チーム開発
 
マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動マイクロソフトにおけるエバンジェリズム活動
マイクロソフトにおけるエバンジェリズム活動
 
機械学習に取り組んでいる企業の紹介
機械学習に取り組んでいる企業の紹介機械学習に取り組んでいる企業の紹介
機械学習に取り組んでいる企業の紹介
 
kintone knowledge summary for jait
kintone knowledge summary for jaitkintone knowledge summary for jait
kintone knowledge summary for jait
 

More from uchan_nos

More from uchan_nos (20)

MikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続するMikanOSと自作CPUをUSBで接続する
MikanOSと自作CPUをUSBで接続する
 
OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事OSを手作りするという趣味と仕事
OSを手作りするという趣味と仕事
 
小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器小型安価なFPGAボードの紹介と任意波形発生器
小型安価なFPGAボードの紹介と任意波形発生器
 
トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路トランジスタ回路:エミッタ接地増幅回路
トランジスタ回路:エミッタ接地増幅回路
 
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクトOpeLa: セルフホストなOSと言語処理系を作るプロジェクト
OpeLa: セルフホストなOSと言語処理系を作るプロジェクト
 
自作言語でお絵描き
自作言語でお絵描き自作言語でお絵描き
自作言語でお絵描き
 
OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会OpeLa 進捗報告 at 第23回自作OSもくもく会
OpeLa 進捗報告 at 第23回自作OSもくもく会
 
サイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返るサイボウズ・ラボへ転籍して1年を振り返る
サイボウズ・ラボへ転籍して1年を振り返る
 
USB3.0ドライバ開発の道
USB3.0ドライバ開発の道USB3.0ドライバ開発の道
USB3.0ドライバ開発の道
 
Security Nextcamp remote mob programming
Security Nextcamp remote mob programmingSecurity Nextcamp remote mob programming
Security Nextcamp remote mob programming
 
Langsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPSLangsmith OpeLa handmade self-hosted OS and LPS
Langsmith OpeLa handmade self-hosted OS and LPS
 
OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作OpeLa セルフホストなOSと言語処理系の自作
OpeLa セルフホストなOSと言語処理系の自作
 
1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG1を書いても0が読める!?隠れた重要命令INVLPG
1を書いても0が読める!?隠れた重要命令INVLPG
 
レガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free osレガシーフリーOSに必要な要素技術 legacy free os
レガシーフリーOSに必要な要素技術 legacy free os
 
Building libc++ for toy OS
Building libc++ for toy OSBuilding libc++ for toy OS
Building libc++ for toy OS
 
プランクトンサミットの歴史2019
プランクトンサミットの歴史2019プランクトンサミットの歴史2019
プランクトンサミットの歴史2019
 
Introduction of security camp 2019
Introduction of security camp 2019Introduction of security camp 2019
Introduction of security camp 2019
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
Timers
TimersTimers
Timers
 
USB3 host driver program structure
USB3 host driver program structureUSB3 host driver program structure
USB3 host driver program structure
 

自動でバグを見つける!プログラム解析と動的バイナリ計装