SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

伏石ちゃんは意図に反したい

リターンアドレスの書き換えってどういう攻撃手法? どんな対策がある?【伏石ちゃんは意図に反したい】

FILE 0x08 リターンアドレスの書き換え

  • X ポスト
  • このエントリーをはてなブックマークに追加

対策2 カナリア値チェックによるスタック保護

充希
これだけで充分じゃないですか?
先生
ところが、リターンアドレスの書き換え自体が起きてしまっている。できればこれも防ぎたい
充希
確かに
先生
それにASLRはOS側の機能だから、OS側でASLRを無効化されていれば無防備だ。そこで、もう一つの対策がある。カナリア値チェックによるスタック保護だ
充希
カナリア値
先生
さっきのサンプルコードを、保護機能を無効にせず、普通にコンパイルするぞ

 先ほどとは異なり、-fno-stack-protectorオプションを外して、コンパイルします。これによりスタック保護機能が有効なプログラムとなります。

$ gcc sample8.c -o ./sample8
先生
そして実行する
$ ./sample8
mainが呼び出されました
Address of main: cf 23 bb af  ba 7f 00 00
Address of A:    a2 23 bb af  ba 7f 00 00
Address of B:    75 23 bb af  ba 7f 00 00
Address of C:    9b 22 bb af  ba 7f 00 00
Address of D:    84 22 bb af  ba 7f 00 00
Aが呼び出されました
Bが呼び出されました
Cが呼び出されました
メモリの内容 before:
00 00 00 00  00 57 3a 3e  5c 11 26 dc  20 0a 8f c7  ff 7f 00 00  93 23 bb af

何か入力してください: 12345

メモリの内容 after:
31 32 33 34  35 00 3a 3e  5c 11 26 dc  20 0a 8f c7  ff 7f 00 00  93 23 bb af

*** stack smashing detected ***: terminated
Aborted (core dumped)
充希
5文字入力したら落ちました
先生
stack smashing detectedとエラーになっている。スタックが破壊されたという意味だ

 スタックについては割愛しますが、ここでは「ローカル変数の領域を越えて書き込みが行なわれた」ことが検出されたと考えてください。

 そして、この境界を越えて書き込みが行なわれたことを検知するのが、カナリア値です。

 アイデアはとても簡単です。

 まず、ローカル変数の領域とその次の領域の間の境界にランダムな値を置いておきます。もし、その部分がバッファオーバーフローで上書きされたら、元の値とは変わってしまいます。

 つまり、実行前のカナリア値と実行後のカナリア値を比較して、値が変わっていれば、境界を越えた書き込みが起きたと判断できるわけです。

 before/afterに注目して見ましょう。

メモリの内容 before:
00 00 00 00  00 57 3a 3e  5c 11 26 dc  20 0a 8f c7  ff 7f 00 00  93 23 bb af
メモリの内容 after:
31 32 33 34  35 00 3a 3e  5c 11 26 dc  20 0a 8f c7  ff 7f 00 00  93 23 bb af

 バッファオーバーフローにより、「00 57 3a 3e」が「35 00 3a 3e」に書き換わってしまいました。これこそが、カナリア値の変化です。これを検知して、プログラムがエラーとなったというわけです。

充希
……ところで、なんでカナリアなんですか?
先生
昔、炭鉱でカナリアが毒ガス検知器として使われていた。それが由来だそうだ
充希
カナリアかわいそう
先生
まあ、保護機能は保護機能に過ぎない。あくまでも、バッファオーバーフローを起こさないようなプログラムを組むことが大切だ。今時の過保護なプログラミング言語に慣れていると、C言語を触ったときに火傷するぞ
充希
C言語触らないようにします
先生
積極性の評価を1にするぞ
充希
や、やめてください
先生
冗談だ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

井二 かける(イブタ カケル)

 情報処理安全確保支援士、プログラマー、作家。「物語の力でIT・セキュリティをもっと面白く」をモットーに、作家活動、セキュリティ啓発活動を行う。主な作品はアニメ「こうしす!」、小説「こうしす!社内SE祝園アカネの情報セキュリティ事件簿」(翔泳社)、マンガ「伏石ちゃんは意図に反したい ~ハッキングから始まる高校生活~」(京姫鉄道出版)など。 Twitter:@k_ibuta@kyoki_railway

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山口 しずか(ヤマグチ シズカ)

 やりたいことはなんでもやる精神で急成長中の漫画家。2019年よりマンガアプリにて商業連載デビュー。連載の傍ら企業のPR漫画や漫画動画など媒体・ジャンルにとらわれず時代に合わせた漫画を制作中。趣味はお酒と旅行。 Twitter:@shizuckey

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15893 2022/05/20 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング