【コラム】

ITセキュリティのアライ出し

22 Windowsにおけるバッファオーバーフロー(6)

 

22/47

連載が「HUNTER×HUNTER」状態になっている件について川柳で言い訳をさせていただくと、こんな感じになる。

誰に似た 若い女性に 笑顔まく
出典: 和光堂「子育て川柳

かの「セキュリティホール memo」を運営される小島先生にご心配をいただいてしまった。恐懼しきりである。

実は冒頭にある通り、筆者の私的な時間は目下、育児に向けられているのが実情である。それはまるで月月火水木金金。世間で云うところのゴールデンウィークなんてございません。したがって編集T氏の辛抱強さに支えられながら、仕事の後はもっぱら子供の世話をする日々であり、著述業の能率は遅々として上がらなかったりしている。連載を心待ちにしている読者諸兄には申し訳ないが……とはいえ、先日、編集T氏がRSA Conference Japanのパネルディスカッションにおいて、参加者席の最前列から壇上の筆者に向けて目から怪光線「原稿よこせビーム」を放っていたことは、ここで特筆するに値するであろう。


というわけで、今週も引き続きWindowsにおけるバッファオーバーフローの話である。一点注意事項がある。今回からC言語の知識が必要となる。

スタックが一時データ置き場であることは何度も繰り返し述べてきたことであるが、ここでスタックが実際にCやC++でコーディングされたプログラムでどのように使用されるのかについて説明する。Windowsにおけるバッファオーバーフローを理解する点で重要なのは、以下の2点である。

  • CやC++でコーディングされたプログラムではサブルーチン毎にスタックが割り当てられる
  • コールスタックとデータスタックは近接の領域に設けられる

実際に、これらを説明するためにスタックベースのバッファオーバーフローを発生させるプログラム(リスト1)を使用する。ちなみに、これら素材は筆者の同僚H氏より許可をもらってご提供いただいた。この場を借りて感謝の念を贈りたい。

リスト1: スタックベースのバッファオーバーフローを発生させるプログラム


void func2(char *ptr)
{
    char buff[100];
(※1)
    strcpy(buff, ptr);
}
void func1(char *ptr)
{
    func2(ptr);
}
int main(int argc, char *argv[])
{
    func1(argv[1]); 
    return 0;
}

上記リストに示されるプログラムは、main関数(メインルーチン)からサブルーチンfunc1が呼び出され、さらにサブルーチンfunc2が呼び出されるプログラム構造となっている。このとき、リスト中の(※1)まで処理が進んだ際のスタックの状況を以下の図に示す。

図1: Func2が呼び出された際のスタックレイアウト

まず補足しよう。このシリーズの第3回目で説明しているように、スタックは特定の基点から低位のアドレス(より小さいアドレス)に向かって成長する(データが書き込まれる)。よって、各サブルーチンで使用されるスタックは呼び出しが進むにつれ、より低位のアドレスが使用される。さらに、リターンアドレス以外にベースポインタというものがスタック中に保存されているが、これは各サブルーチンで使用されるスタックの最下部を指し示すアドレスを保持する(特定のレジスタに書き込んでおく)ためのものである。

さて、一瞥してもわかるように、各サブルーチンで使用されるデータスタック・コールスタックは近接している。ちなみに、近接しているといっても、この図1のように必ずしも密接しているとは限らず、コンパイラによって生成されるコードやOSに依存していることがある──という端的な意味も込めて、func1のデータスタックとコールスタックの間に間隔を作ってある(笑)。すなわち、これはあくまでも基本概念としての構成であり、実装はかなり異なるのである。したがって実際のプログラムをデバッグして、メモリ中に「歯抜け」なデータがあったとしても何ら不思議はないのである。このことは注意しておく価値がある。

さて、このプログラムは第一引数をそのまま100バイト長のバッファ(char buff[100])にstrcpy()関数を使用してコピーするコーディングをしている。このライブラリ関数は「FreeBSD Developers' Handbook」にもあるように、「バッファオーバーフローを生じさせやすい危険な関数」のひとつとして指定している文献が多い。前述の文献に示される関数に加えて、memcpy()やMultiByteToWideCharなどもバッファオーバーフローを発生させる誤用が起きやすい関数とされている

話を戻そう。一般的に、バッファへのアクセスは100バイト長のバッファの先頭アドレスから正方向のオフセットをとることで行われる。これは本連載の第18回にも書いたが、前述の「バッファオーバーフローを生じさせやすい危険な関数」などを使用した場合も、同様に正方向にオフセットを加えていくことでデータの複製を行うことが通常である。つまり、イメージとしては図2中のbuff[100]の長方形の上部から下部に向かってデータのコピーが行われることになる。

図2:strcpy()によるデータコピー発生のイメージ

他の文献などでも指摘されているように「バッファオーバーフローを生じさせやすい危険な関数」は

  1. コピー元の文字列長をチェックせず
  2. コピー元の文字列に含まれるNULLを検出し、それを終端とみなす

という仕様を含んでいることがほとんどである。このため、コピー先のバッファの大きさを無視して、データを書き込んでしまうことがある。これが、スタックにおいて発生した場合、リターンアドレスやベースポインタの書き換えにつながりうる。これがスタックベースのバッファオーバフローの基本である。

22/47

インデックス

連載目次
第47回 今年で7回目の開催になる日本的なCTFを見学してみた
第46回 EAF出撃す
第45回 再会、EMET
第44回 世界のカンファレンスの景色から - RECON その6
第43回 世界のカンファレンスの景色から - RECON その5
第42回 世界のカンファレンスの景色から - RECON その4
第41回 世界のカンファレンスの景色から - RECON その3
第40回 世界のカンファレンスの景色から - RECON その2
第39回 世界のカンファレンスの景色から - RECON その1
第38回 Adobe Flash PlayerおよびReaderのゼロディ脆弱性を分析する その2
第37回 Adobe Flash PlayerおよびReaderのゼロディ脆弱性を分析する
第36回 続・EMET - メモリアドレスを攻撃者より先に確保せよ
第35回 久々登場! "アライ出し・再生"の一発目はWindowsセキュリティ
第34回 実在するマルウェアのホスティングサービス - 迷惑メールとマルウェア(3)
第33回 感染先の選り好みをするマルウェア - 迷惑メールとマルウェア(2)
第32回 難読化するマルウェア - 迷惑メールとマルウェア(1)
第31回 ボットネットの観測方法をさらに詳しく分析する(2) - Krakenの狙いとは
第30回 ボットネットの観測方法をさらに詳しく分析する(1) - Obfuscationの実際
第29回 Kraken騒動とボットネット観測方法への賛否両論
第28回 マルウェア作成キットの歴史~過去から現在へ(下) - Pinchが作った量産体制
第27回 マルウェア作成キットの歴史~過去から現在へ(中) - Agobotが現れた!
第26回 マルウェア作成キットの歴史~過去から現在へ(上) - VCLからクルニコワまで
第25回 iPhoneの解析が進行中 - "Black Hat Japan 2007"見聞録
第24回 Vistaのカーネルモードドライバへのコード署名要件にかかる問題のまとめ(2)
第23回 Vistaのカーネルモードドライバへのコード署名要件にかかる問題のまとめ(1)
第22回 Windowsにおけるバッファオーバーフロー(6)
第21回 ウイルス分析合宿中につき…「世界のホシザワにしごかれるの巻」
第20回 Windowsにおけるバッファオーバーフロー(5)
第19回 2006年を振り返る
第18回 Windowsにおけるバッファオーバーフロー(4)
第17回 Windowsにおけるバッファオーバーフロー(3)
第16回 Windowsにおけるバッファオーバーフロー(2)
第15回 Windowsにおけるバッファオーバーフロー(1)
第14回 検索エンジンと情報セキュリティ(2)
第13回 検索エンジンと情報セキュリティ(1)
第12回 PoCの内側 - Heap Spray(2)
第11回 PoCの内側 - Heap Spray(1)
第10回 標的型攻撃に関する一考察(7) - 対策とまとめ
第9回 標的型攻撃に関する一考察(6) - 脆弱性発見手法の進化(後編)
第8回 標的型攻撃に関する一考察(5) - 脆弱性発見手法の進化(中編)
第7回 標的型攻撃に関する一考察(4) - 脆弱性発見手法の進化(前編)
第6回 標的型攻撃に関する一考察(3) - 関連資料から探る脅威の実像(後編)
第5回 標的型攻撃に関する一考察(2) - 関連資料から探る脅威の実像(前編)
第4回 標的型攻撃に関する一考察(1) - 0-day Exploit利用形の頻発
第3回 コンピュータウイルスの過去・現在・未来(2) ウイルスに寄生するウイルス
第2回 コンピュータウイルスの過去・現在・未来(1) ウイルスの捕食-被食関係
第1回 統計から読み取るRootkitとボットの関係

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

3Dプリンタで会社生活の悩みを解決しよう! 第1回 どれが自分のビニ傘か一発でわかる「傘タグ」
[11:00 7/29] テクノロジー
「2016年夏ドラマ」19作を視聴&ガチ採点! 視聴率や俳優の人気は無視、本当に面白い作品はコレだ
[11:00 7/29] エンタメ
こぶしファクトリー「"こぶし組"の輪を広めて有名なグループに」と意気込み
[11:00 7/29] エンタメ
シリコンバレー101 第670回 ポケモンGO便乗アプリ、成功したアプリとつまづいたアプリの違い
[11:00 7/29] 企業IT
竹尾の紙に"電子回路を印刷" - 「紙のミライ」を探る企画展
[11:00 7/29] 企業IT

求人情報