0

RaspberryPiのスタックオーバーフローからcコードを安全にしようとしています。私はこれの初心者なので、少し我慢してください。関数を呼び出すことによって使用されるバイト数を決定する1つの方法は、スタック上のスペースを既知の値(0xffなど)で埋めることによって初期化することであると言われました。次に、関数を実行してから逆方向に検索して、既知の値から変更されたスタックの数を確認します。元のスタックの深さと最初の変更されていない値の前のスタックの深さを取得することで、その関数によって使用されたスタックの量を判別できます。私には合理的に聞こえた。

私の問題は、このアセンブリのものが本当に私を混乱させることです。asm()を使用してcコードにARMアセンブリコードを埋め込むことができることを読んでいますが、スタックメモリを初期化してから戻って確認する方法がわかりません。私が見ることができる、役立つリソースはありますか?アセンブリについてはほとんど知らないので、非常に優れた検索用語を作成する方法すらわかりません。

ありがとう。

4

2 に答える 2

2

これは、安全にどれだけ深く進むことができるかについての良いアイデアがあれば、asmで非常に簡単に実行できるはずです(引数として渡すこともできます)

.globl fill_stack
fill_stack:
  mov r2,sp
  mvn r3,#0
fsloop:
  stmdb r2!,{r3}
  subs r0,r0,#1
  bne fsloop
  bx lr

上記のCプロトタイプは

void fill_stack ( unsigned int );

ここで、パラメーターは、入力する32ビットワードの数です。

asmをfill_stack.sなどのファイルに入れ、そのファイルをcプログラムを使用してコンパイラのコマンドラインに追加します(または、cコンパイラをそのように使用しない場合は、オブジェクトとリンクに個別にアセンブルします)。インラインアセンブリは難しく、努力する価値はありません。

于 2012-11-01T00:40:18.540 に答える
0

アセンブリでこれを行う必要はないと思います。Cで行うことができます

void stack_init(unsigned int size)
{
        int i;
        unsigned char mem[size];

        for (i = 0; i < size; i++)
                mem[i] = 0xAA; /* Best not to use 0 or all ones */
}

unsigned int stack_check(unsigned int max)
{
        int i;
        unsigned char mem[max];

        for (i = max - 1; i >= 0; --i) {
                if (mem[i] != 0xAA)
                        break;
        }
        return i + sizeof(int);
}
于 2012-10-31T23:07:53.703 に答える