自己紹介
こんにちは、エーピーコミュニケーションズiTOC事業部 BzD部 0-WANの田中と申します。
弊社でEDR製品を導入いただいたお客様のインシデント調査を主に担当しております。
その傍らプログラマーとしての経験と知識を生かしてセキュリティに関するウェブアプリケーションを設計構築するなどSOCチームのメンバーとして日々サイバーセキュリティと共に在るエンジニアです。
TryHackMeの「Advent of Cyber2023の復習と2024の予習」をテーマにした連載第5回目の今回は「Memory corruption(メモリー破壊)」の問題に挑戦してみましょう。
一般的なTryHackMeの使い方は以下にまとめてありますので参照してください。 techblog.ap-com.co.jp
過去のTryHackMe Advent of Cyber 2023に関する記事は以下の通りです。
2024/3 TryHackMe Advent of Cyber 2023から2024へ(1) What is TryHackMe? - APC 技術ブログ
2024/4 TryHackMe Advent of Cyber 2023から2024へ(2) Machine learning(機械学習) - APC 技術ブログ
2024/5 TryHackMe Advent of Cyber 2023から2024へ(3) Log analysis(ログ分析) - APC 技術ブログ
2024/6 TryHackMe Advent of Cyber 2023から2024へ(4) Reverse engineering(リバースエンジニアリング) - APC 技術ブログ
2024/7 TryHackMe Advent of Cyber 2023から2024へ(5) Memory corruption(メモリー破壊) - APC 技術ブログ
2024/8 TryHackMe Advent of Cyber 2023から2024へ(6) SQL injection(SQLインジェクション) - APC 技術ブログ
2024/9 TryHackMe Advent of Cyber 2023から2024へ(7) SSRF(サーバサイド・リクエスト・フォージェリ) - APC 技術ブログ
2024/10 TryHackMe Advent of Cyber 2023から2024へ(8) Mobile analysis(モバイル分析) - APC 技術ブログ
タスク「Memory corruption(メモリー破壊)」
今回挑戦するタスクはこちらです。
[Day 6]Memories of Christmas Past(過去のクリスマスの思い出)
[ウォークスルービデオをみるにはここをクリックしてください!]の▲をクリックすると解説動画を表示できますので必要に応じてチェックしてみてください。
このタスクの学習目標は以下の通りです。
- 特定の言語がメモリを安全に処理できない場合があることを理解します。
- 変数が隣接するメモリにオーバーフローして破損する可能性がある仕組みを理解します。
- 単純なバッファ オーバーフローを悪用して、アクセスできないはずのメモリを直接変更します。
バッファ オーバーフロー
C言語で以下のようなプログラムを書いたとします。
「test」という文字列を指定してプログラムを実行すると以下のように指定した文字列が出力されます。
では「AAAAAAAAAAAAAAAAAAAA」のように10バイト以上の文字列を入力するとどうなるでしょうか。
セグメンテーションフォルト(Segmentation Fault)は、プログラムが許可されていないメモリ領域にアクセスしようとしたときに発生するエラーで、上の例では配列やバッファの範囲外にアクセスして他のメモリ領域を上書きしたためエラーが発生しました。
このようにバッファオーバーフローは以下のような問題を生じさせます。
プログラムのクラッシュ: プログラムが予期しないデータによりクラッシュすることがあります。
データの改ざん: バッファの後に配置されている変数やデータが上書きされ、予期しない動作を引き起こすことがあります。
コードの実行: 悪意のある攻撃者がバッファオーバーフローを利用して、自分の好きなコードを実行させることができます。これにより、システムの乗っ取りや機密情報の漏洩などが発生する可能性があります。
ゲームのメモリを見る
このタスクの右上にある緑色の「マシンを起動」ボタンをクリックしてゲームを起動します。
ブラウザのアドレスバーに画面に表示されるURL(ここではhttps:// 10-10-162-169.p.thmlabs.com)を入力するとゲームにアクセスできます。
キーボードのスペースキーを押します。
ゲームの操作方法が表示されます。
このゲームのゴールはVan Frosty からクリスマス ツリーの星を購入してクリスマスを救うことです。 ゲームを始めましょう。
矢印キーを操作してVan Hollyのところに行きます。スペースキーで会話できます。 Van Hollyと会話すると所持するコインの数に応じて1文字1コインで名前を変更できます。
同様にVan Frostyと会話すると購入できるクリスマス飾りのリストが表示されます。
クリスマス ツリーの星の値段が10000コインということがわかります。
現在の所持コインは1です。 コインを稼ぐにはPCのところに行って地道にスペースキーを押します。
しかしやりすぎるとPCが故障してしまいます。目的の10000コインはいつになったら貯まるのでしょう。
ここでTABキーを押してデバッグモードに切り替えます。
TABキーを繰り返し押すとASCIIビューとHEXビューに切り替えることができます。 HEXビューでコインの数を表す変数coinsの値を見ると10 00 00 00になっています。 この値を変えることができたら所持するコインの数を増やせそうです。
そのためにすぐ上の変数player_nameをあふれさせる(オーバーフローさせる)ことができるか試してみましょう。 player_nameは12バイトなのでVan Hollyと会話して13バイト「aaaabbbbccccx」を渡してみましょう。
予想どおり所持するコインの数が16から120に増えました。
13バイト目のxがplayer_nameの1バイト目に入っているのがわかります。
HEXモードでみると78が入っています。オンラインツールを利用して16進数から10進数に変換してみましょう。
現在所持するコインの数が120になるからくりが明らかになりました。
深堀り調査
他の変数を調査するためにクリスマス飾りを購入してみましょう。
キーボードで3を押してキノコを購入します。
デバッグモードで変数の値を確認してみましょう。
左のクリスマス飾りリストとデバッグモードの変数値を比較すると何かわかりそうですね。
星が入手できたらクリスマスツリーの前に行きスペースキーを押して会話してください。
問題に挑戦
では実際に問題を解いてみましょう。
問題1.コイン変数が下の画像のメモリ内値を持っていたとしたら、ゲーム内でコインはいくつあるでしょうか?
先ほどのオンラインツールを利用してコインの数を答えてください。リトルエンディアンに注意してください。
問題2.最終フラグの値は何ですか?
クリスマスツリーが教えてくれます。
まとめ
いかがでしたでしょうか? 文字通りゲーム感覚で楽しみながら変数とメモリの関係を理解することができたのではないでしょうか。 もっと深く学びたい方はIPAのコンテンツもおすすめです。 www.ipa.go.jp
今回はMemory corruption(メモリー破壊)のテーマのもと以下について学ぶタスクをご紹介しました。
- 特定の言語がメモリを安全に処理できない場合があることを理解します。
- 変数が隣接するメモリにオーバーフローして破損する可能性がある仕組みを理解します。
- 単純なバッファ オーバーフローを悪用して、アクセスできないはずのメモリを直接変更します。
最後まで読んでいただきありがとうございました。次回もお楽しみに。
0-WANについて
私たち0-WANは、ゼロトラスト製品を中心とした、マルチベンダーでのご提案で、お客様の経営課題解決を支援しております。 ゼロトラストってどうやるの?製品を導入したけれど使いこなせていない気がする等々、どんな内容でも支援いたします。 お気軽にご相談ください。
問い合わせ先、0-WANについてはこちら。 www.ap-com.co.jp
一緒に働いて頂ける仲間も募集しています
今までの経験を活かして、私たちと一緒にゼロトラスト分野で活躍しませんか? www.ap-com.co.jp