APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

TryHackMe Advent of Cyber 2023から2024へ(5) Memory corruption(メモリー破壊)

自己紹介

こんにちは、エーピーコミュニケーションズ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に関する記事は以下の通りです。

タスク「Memory corruption(メモリー破壊)」

tryhackme.com

今回挑戦するタスクはこちらです。

[Day 6]Memories of Christmas Past(過去のクリスマスの思い出)

タスク12 [6日目]メモリ破損クリスマスの思い出

[ウォークスルービデオをみるにはここをクリックしてください!]の▲をクリックすると解説動画を表示できますので必要に応じてチェックしてみてください。

このタスクの学習目標は以下の通りです。

  • 特定の言語がメモリを安全に処理できない場合があることを理解します。
  • 変数が隣接するメモリにオーバーフローして破損する可能性がある仕組みを理解します。
  • 単純なバッファ オーバーフローを悪用して、アクセスできないはずのメモリを直接変更します。

バッファ オーバーフロー

C言語で以下のようなプログラムを書いたとします。

バッファオーバーフローが発生するコード

「test」という文字列を指定してプログラムを実行すると以下のように指定した文字列が出力されます。

プログラム実行すると指定した文字列が表示される

では「AAAAAAAAAAAAAAAAAAAA」のように10バイト以上の文字列を入力するとどうなるでしょうか。

10文字以上の文字列を渡す

セグメンテーションフォルト(Segmentation Fault)は、プログラムが許可されていないメモリ領域にアクセスしようとしたときに発生するエラーで、上の例では配列やバッファの範囲外にアクセスして他のメモリ領域を上書きしたためエラーが発生しました。

このようにバッファオーバーフローは以下のような問題を生じさせます。

  • プログラムのクラッシュ: プログラムが予期しないデータによりクラッシュすることがあります。

  • データの改ざん: バッファの後に配置されている変数やデータが上書きされ、予期しない動作を引き起こすことがあります。

  • コードの実行: 悪意のある攻撃者がバッファオーバーフローを利用して、自分の好きなコードを実行させることができます。これにより、システムの乗っ取りや機密情報の漏洩などが発生する可能性があります。

ゲームのメモリを見る

このタスクの右上にある緑色の「マシンを起動」ボタンをクリックしてゲームを起動します。

ブラウザのアドレスバーに画面に表示されるURL(ここではhttps:// 10-10-162-169.p.thmlabs.com)を入力するとゲームにアクセスできます。

ゲームにアクセス

キーボードのスペースキーを押します。

ゲーム画面

ゲームの操作方法が表示されます。

ゲームの操作方法

このゲームのゴールはVan Frosty からクリスマス ツリーの星を購入してクリスマスを救うことです。 ゲームを始めましょう。

矢印キーを操作してVan Hollyのところに行きます。スペースキーで会話できます。 Van Hollyと会話すると所持するコインの数に応じて1文字1コインで名前を変更できます。

スペースキーでVan Hollyと会話

同様にVan Frostyと会話すると購入できるクリスマス飾りのリストが表示されます。

スペースキーでVan Frostyと会話

クリスマス ツリーの星の値段が10000コインということがわかります。

販売リスト

現在の所持コインは1です。 コインを稼ぐにはPCのところに行って地道にスペースキーを押します。

しかしやりすぎるとPCが故障してしまいます。目的の10000コインはいつになったら貯まるのでしょう。

仕事をして稼いでいたら…

ここでTABキーを押してデバッグモードに切り替えます。

TABキーでデバッグモードに切り替える

TABキーを繰り返し押すとASCIIビューとHEXビューに切り替えることができます。 HEXビューでコインの数を表す変数coinsの値を見ると10 00 00 00になっています。 この値を変えることができたら所持するコインの数を増やせそうです。

そのためにすぐ上の変数player_nameをあふれさせる(オーバーフローさせる)ことができるか試してみましょう。 player_nameは12バイトなのでVan Hollyと会話して13バイト「aaaabbbbccccx」を渡してみましょう。

13バイトをplayer_nameにセット

予想どおり所持するコインの数が16から120に増えました。

所持するコインの数が増えた

13バイト目のxがplayer_nameの1バイト目に入っているのがわかります。

xが入っている

HEXモードでみると78が入っています。オンラインツールを利用して16進数から10進数に変換してみましょう。

16進数で78

現在所持するコインの数が120になるからくりが明らかになりました。

深堀り調査

他の変数を調査するためにクリスマス飾りを購入してみましょう。

キーボードで3を押してキノコを購入します。

クリスマス飾りを購入

デバッグモードで変数の値を確認してみましょう。

inv_itemsの値は?

左のクリスマス飾りリストとデバッグモードの変数値を比較すると何かわかりそうですね。

名前を工夫すると星が入手できる

星が入手できたらクリスマスツリーの前に行きスペースキーを押して会話してください。

答えはみつかりましたか?

問題に挑戦

では実際に問題を解いてみましょう。

問題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