スタック領域の壊し方についてです


VC++6に於いて、下記のy10のエリアを下位の関数で1BYTE多く初期化したとしたら
どこを壊すのでしたっけ??
 ※最近、PGから離れていて失念してしまいました

bool AbcCtrl::ABCD(int x1, CString x2, AAA& X3List, int X4){
int y1;
int y2;
int y3;
int y4;
int y5;
int y6;
int y7;
int y8;
int y9;
char y10[255]

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/06/23 15:36:56
  • 終了:2009/06/23 16:17:24

ベストアンサー

id:JULY No.1

JULY回答回数966ベストアンサー獲得回数2472009/06/23 16:02:38

ポイント60pt

バッファ・オーバーフロー解消の道筋は見えた(中):ITpro

コンパイラの最適化の影響を受けない、という前提にはなりますが、y9 の中身を書き換えることになります。

で、Windows が動くのは Intel x86 上ですから、リトルエンディアンになるので、y10 を 1 byte 超えて書き込むと、その 1 byte は y9 の下位 1 byte を上書きすることになります。

もちろん、コンパイルオプションによって違います。

例えば、y9 が実際には利用されていなければ、おそらく最適化で、y9 は実際にはスタック上に領域を確保しないと思います。また、頻繁に更新するのであれば、レジスタに割り当てられるかもしれません。

  • id:drill256
    終了してしまったので、コメントで。
    私もうろ覚えですが、基本的にy9の領域だと思います。


    VC6が手元にないので、はっきりとは調べられませんが、VS2003、VS2005では、
    デバッグモードの時は、スタック破壊を検知するために変数の前後4バイトに
    パディングが入ります。
    したがって、デバッグモード時はこのパディングを壊します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません