17

現在、Visual Studio 2012 Express で作成されたいくつかの小さな C プログラムを逆アセンブルしていますが、バイナリ間の傾向に気付きました。

メイン関数で実行される命令の最初のセットは常に次のとおりです。

SUB ESP,154                       ; Doesn't have to be 0x154.
.....
.....
.....
LEA EDI,DWORD PTR SS:[EBP-154]
MOV ECX,55                        ; Also doesn't have to be 0x55.
MOV EAX,CCCCCCCC
REP STOS DWORD PTR ES:[EDI]

では、なぜマシンはこの 0xCCCCCCCC でスタックを埋めるのでしょうか? 初期化されていないスペースのマークとして、VC ++などで使用されていることを読みましたか?

次に、バッファ内に何かを配置するとします...コンパイラまたはプロセッサは、このスペース内のランダムなポイントに配置することを決定しますが、なぜそこに配置するのかわかりません...

EBP-90   > CCCCCCCC  ÌÌÌÌ
EBP-8C   > CCCCCCCC  ÌÌÌÌ
EBP-88   > CCCCCCCC  ÌÌÌÌ
EBP-84   > 00000001  ...  ; Why this place?
EBP-80   > CCCCCCCC  ÌÌÌÌ
EBP-7C   > CCCCCCCC  ÌÌÌÌ
EBP-78   > 41414141  AAAA ; Why this far from both the top and bottom of the stack?
EBP-74   > CCCCCC00  .ÌÌÌ
EBP-70   > CCCCCCCC  ÌÌÌÌ
EBP-6C   > CCCCCCCC  ÌÌÌÌ

と...

EBP-14   > CCCCCCCC  ÌÌÌÌ
EBP-10   > CCCCCCCC  ÌÌÌÌ
EBP-C    > 00000000  ....  ; Why here?
EBP-8    > CCCCCCCC  ÌÌÌÌ
EBP-4    > 7EA7D069  iЧ~  ; I think this is some stack cookie stuff.
EBP ==>  >/0017FEA8  ¨þ.   ; Saved EBP.

1 と 0 の dword がここに格納されているのは、いくつかの if ステートメントのためですが、なぜそれらがどこに配置されているのか疑問に思っています。その背後に何らかのロジックがある場合。

ありがとうございました。

4

2 に答える 2

3

Visual Studio について話すことはできませんが、私がコーディングした一部の環境では、意図的にスタックを事前定義された値 (0xcccccccc など) で埋めました。これは、スタックを (一番下から) スキャンして、使用されていない量を判断できるようにするために行われました。メモリの量がかなり制限される可能性がある組み込みシステムでは、メモリの使用を最適化できるため、これは開発中にかなり役立ちます。

お役に立てれば。

于 2013-07-14T22:37:29.500 に答える