1

組み込みデバイスに問題があり、スタックオーバーフローに関連している可能性があります。

これをテストするために、スタックをマジックバイトで埋めてから、そのまま残っているマジックバイトの量を調べて、スタックがオーバーフローしたかどうかを定期的に確認することを計画していました。

しかし、スタックを機能させるためのルーチンを取得できません。アプリケーションは即座にクラッシュし続けます。これは、私がプログラムのエントリポイントで行ったことです。

    //fill most of stack with magic bytes
    int stackvar = 0;
    int stackAddr = (int)&stackvar;
    int stackAddrEnd = stackAddr - 25000;
    BYTE* stackEnd = (BYTE*) stackAddrEnd;

    for(int i = 0; i < 25000; ++i)
    {
        *(stackEnd + i) = 0xFA;
    }

割り当てられたスタックが25kより大きいことに注意してください。したがって、この時点ですでに使用されているスタックスペースを頼りにしています。また、スタックが上位から下位のアドレスに増加することにも注意してください。そのため、下から上に塗りつぶそうとしています。

しかし、私が言ったように、これはクラッシュします。私はここで何かが欠けているに違いありません。

4

2 に答える 2

1

他の人がすでに指摘しているように、上書きしますstackEnd。あなたのエンディアンに応じて、25000よりもすでに大きい(64250)0xXXXXFAFAへのポインタ、または別の場所にある0xFAFAXXXXへのポインタになります。

これは組み込みデバイスであり、i386 とはまったく異なるアーキテクチャであるため、スタックが下向きではなく上向きに成長する可能性は十分にあります。

于 2012-11-01T17:12:33.257 に答える