memologueスマートフォン用の表示で見るmemologueこの広告は、90日以上更新していないブログに表示しています。(2)security前回(クイズ)の続きです。自分で解いてみた結果を貼っておきます。(8)とか(9)はそれなりに面白いかと。+++1バイトのmallocに対して65537バイトのmemcpyを行ってSEGVします。+++1バイトのmallocに対して長大な文字列のstrcpyを行ってSEGVします。確実にクラッシュさせるために、shellcode2を長めにしています。new(UINT_MAX)と解釈されて、メモリ確保失敗でstd::bad_allocが飛びます。+++0バイトのmallocに対して*2、UINT_MAXバイトのstrncpyを行ってSEGVします。+++if文でのチェックをすり抜けて128バイトのスタック上の配列に5000バイトを書いてSEGVします。いえば、この問題のMSDNの解説は間違っているような。+++結果、0バイトmallocした領域にUINT_MAXバイトmemcpyしてSEGVしています。int型だったとしても、memcpyの第三引数はsize_t型(符号なし)ですから結果は一緒です。+++SEGVします。memcpyの第三引数はsize_t型(符号なし)ですから、-1を渡すとUINT_MAXを渡したのと同様に振舞います。+++SEGVします。sizeof(int)))と等価ですので、負数を与えると、配列tableの終わりよりもっと後ろの方にもアクセスできます。メモリ上のほぼお好きな4バイトをお好きな値に書き換えることができます。応用方法は自由自在です。ProPoliceなどのcanary系プロテクションでは検出できないメモリの改ざんができるので、厄介ですね。この件は面白いので、別エントリでも扱います。+++0バイトmallocした領域に長大な文字列をstrcpyしてSEGVします。{という判定方法に問題があります。buf_lenが0にもかかわらず、if文が真になりません。int型の最大値であるUINT_MAXになります。