■変数の書き換え BOFは確保した領域より大きいデータをあたえることで「あふれ」を引き起こす あふれによって隣接するメモリを「低位から高位に」書き換える ローカル変数はスタックに確保される スタックは高位から低位に伸びる 先に宣言したやつを後に宣言した変数のBOFで書き換えられるかも 例題6.1 「a」*17なので、name配列に12文字格納されたのち、5文字があふれる あふれた先はscore変数を侵し、scoreを「aaaa」で書き換える(scoreは4バイトなので) これで16文字の行き先はわかったが、残り1文字はscoreのさらに隣のstargeを侵す stargeは0に初期化されてるので「a000」という風になる aはASCIIコードで0x61、scoreは32ビットなので0x61616161=1633771873 よって出力は Score of aaaaaaaaaaaaaaaaa is 1633771873!! となる ラダーモデルとしては次のような図が描ける +----------------+0x00001 | | +----------------+0x00002 | | : : +----------------+0x00078 | name[0] a | +----------------+0x00079 | name[1] a | +----------------+0x00080 | name[2] a | +----------------+0x00081 | name[3] a | +----------------+0x00082 | name[4] a | +----------------+0x00083 | name[5] a | +----------------+0x00084 | name[6] a | +----------------+0x00085 | name[7] a | +----------------+0x00086 | name[8] a | +----------------+0x00087 | name[9] a | +----------------+0x00088 | name[10] a | +----------------+0x00089 | name[11] a | +----------------+0x00090 | score a | | score a | | score a | | score a | +----------------+0x00094 | starge a | | starge 0 | | starge 0 | | starge 0 | +----------------+0x00098