在一些书里,或是论坛里,总会看到有作者把 CC 认定为是 x86 软中断(int 3)。但见作者除了发挥联想和照抄之外,似乎都不给出这个说法的确切依据。
这个说法明显很说不通。
微软使用如下常见的填充值:
ABABABAB
BAADF00D
CCCCCCCC
CDCDCDCD
DDDDDDDD
DEADDEAD
FDFDFDFD
FEEEFEEE
只看1个字节的话,这里唯独 CC 刚好与x86的某条特殊指令,即 int 3 指令的字节码相同。按此理解,填充 0xCCCCCCCC,相当于连续设置了4个断点。
问题是,这里设置断点有什么用处呢?栈内存默认是不可执行的,即便指令指针 EIP 不慎指向了栈内存,结果将是访问违规,根本用不上断点!
如果说是为了防范程序不慎先将栈内存设置为可执行的,再跳到栈内存执行,那么不妨先回答三个问题:
1,这还算是不慎吗?
2,为何不也用 0xCC 填充其它内存呢?
3,有听说谁真的经历过这种软中断吗?
另一方面,微软似乎从未声称这里的 CC 是软中断。
/GZ VC6的编译选项:用 0xCC 填充未显式初始化的局部变量的内存。
MSDN链接
这里也指出了不用
这个说法明显很说不通。
微软使用如下常见的填充值:
ABABABAB
BAADF00D
CCCCCCCC
CDCDCDCD
DDDDDDDD
DEADDEAD
FDFDFDFD
FEEEFEEE
只看1个字节的话,这里唯独 CC 刚好与x86的某条特殊指令,即 int 3 指令的字节码相同。按此理解,填充 0xCCCCCCCC,相当于连续设置了4个断点。
问题是,这里设置断点有什么用处呢?栈内存默认是不可执行的,即便指令指针 EIP 不慎指向了栈内存,结果将是访问违规,根本用不上断点!
如果说是为了防范程序不慎先将栈内存设置为可执行的,再跳到栈内存执行,那么不妨先回答三个问题:
1,这还算是不慎吗?
2,为何不也用 0xCC 填充其它内存呢?
3,有听说谁真的经历过这种软中断吗?
另一方面,微软似乎从未声称这里的 CC 是软中断。
/GZ VC6的编译选项:用 0xCC 填充未显式初始化的局部变量的内存。
MSDN链接
这里也指出了不用