Uninitialized Variables

htARTE(HackTricks AWS Red Team Expert) を通じてゼロからヒーローまでAWSハッキングを学ぶ

HackTricks をサポートする他の方法:

基本情報

ここでの中心的なアイデアは、未初期化変数がどのように振る舞うかを理解することです。それらは、それらに割り当てられたメモリ内の値を持つことになります。 例:

  • 関数1: initializeVariable: 変数 x を宣言し、値を割り当てます。たとえば 0x1234 とします。このアクションは、メモリ内の場所を予約し、特定の値を入れることに似ています。

  • 関数2: useUninitializedVariable: ここでは、別の変数 y を宣言しますが、値を割り当てません。C言語では、未初期化変数は自動的にゼロに設定されません。代わりに、それらはメモリ位置に最後に格納された値を保持します。

これらの2つの関数を順次実行すると:

  1. initializeVariable では、x に値 (0x1234) が割り当てられ、特定のメモリアドレスを占有します。

  2. useUninitializedVariable では、y が宣言されますが、値は割り当てられず、x の直後のメモリスポットを取ります。y を初期化しなかったため、x が使用していたメモリ位置から値を「継承」することになります。

この振る舞いは、低レベルプログラミングにおける重要な概念を示しています: メモリ管理が重要であり、未初期化変数は予測不可能な振る舞いやセキュリティの脆弱性を引き起こす可能性があります。なぜなら、それらは意図せずにメモリに残された機密データを保持する可能性があるからです。

未初期化スタック変数には、次のようなセキュリティリスクがあります:

  • データ漏洩: パスワード、暗号キー、個人情報などの機密情報が未初期化変数に格納されている場合、攻撃者がこれらのデータを読み取る可能性があります。

  • 情報開示: 未初期化変数の内容は、プログラムのメモリレイアウトや内部動作に関する詳細を明らかにする可能性があり、攻撃者が標的型の攻撃を開発するのに役立ちます。

  • クラッシュと不安定性: 未初期化変数を含む操作は未定義の動作を引き起こし、プログラムのクラッシュや予測不可能な結果をもたらす可能性があります。

  • 任意のコード実行: 特定のシナリオでは、攻撃者がこれらの脆弱性を悪用してプログラムの実行フローを変更し、任意のコードを実行する可能性があり、それにはリモートコード実行の脅威が含まれる場合があります。

#include <stdio.h>

// Function to initialize and print a variable
void initializeAndPrint() {
int initializedVar = 100; // Initialize the variable
printf("Initialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&initializedVar, initializedVar);
}

// Function to demonstrate the behavior of an uninitialized variable
void demonstrateUninitializedVar() {
int uninitializedVar; // Declare but do not initialize
printf("Uninitialized Variable:\n");
printf("Address: %p, Value: %d\n\n", (void*)&uninitializedVar, uninitializedVar);
}

int main() {
printf("Demonstrating Initialized vs. Uninitialized Variables in C\n\n");

// First, call the function that initializes its variable
initializeAndPrint();

// Then, call the function that has an uninitialized variable
demonstrateUninitializedVar();

return 0;
}

動作原理:

  • initializeAndPrint 関数:この関数は整数変数 initializedVar を宣言し、値 100 を割り当て、その後変数のメモリアドレスと値を表示します。このステップは直感的で、初期化された変数の振る舞いを示しています。

  • demonstrateUninitializedVar 関数:この関数では、初期化せずに整数変数 uninitializedVar を宣言します。その値を表示しようとすると、出力にはランダムな数値が表示されるかもしれません。この数値は、以前そのメモリ位置にあったデータを表します。環境やコンパイラによって、実際の出力は異なる場合があり、時には安全のために一部のコンパイラが変数を自動的にゼロに初期化することがありますが、これに依存すべきではありません。

  • main 関数main 関数は上記の両方の関数を順番に呼び出し、初期化された変数と初期化されていない変数の対比を示しています。

ARM64 の例

ARM64 では、ローカル変数もスタックで管理されるため、この例を確認できます。

htARTE (HackTricks AWS Red Team Expert) でゼロからヒーローまでAWSハッキングを学びましょう

HackTricks をサポートする他の方法:

Last updated