作者回复: 是的。可以这么说。不过我们在说expand这个词的时候,往往用于栈空间不足了,需要对栈进行动态扩展这种场景。你说的很对,rsp指针的上移并没有真的把栈上的数据清空掉,所以我们在使用局部变量的时候一定要初始化,否则就有可能访问到上次释放的栈内存。你掌握的很好!
作者回复: 对的。这说明你真的动手实践过了。这就掌握得很好了。你的看法都是对的。
作者回复: 是的。是这样的。就是通过把bad函数的地址写到栈上,然后就使得ret指令跑进bad函数里面运行了。两个要素:一是越界读写,一是覆盖栈上的返回地址。
作者回复: Right! Java没有指向栈上的指针,这个设计很重要。
作者回复: 往往无意识的缓冲区溢出,因为会拿随机值覆盖有效值,所以会带来segment fault,覆盖了本栈帧的关键数据,或者覆盖了其他栈帧的数据都有可能造成segment fault。但是精心构造的缓冲区溢出,就像课程里对test函数的攻击,是可以把控制流导向恶意代码的。保护机制其实是在关键位置,比如栈帧开始处,编译器自动插入变量,函数结束时再检查一下,如果变化了就主动触发fault,以增强安全性,所以不一定是溢出到别的栈帧,两者之间没有必然联系
作者回复: 编译器在做编译优化的过程中会计算的。具体地说就是寄存器分配这一步就能统计出来需要多大的栈空间。
作者回复: 其实这是本科阶段的三节课:汇编原理,计算机组成和计算机体系结构的内容。我们学了三个学期的呀。一下子记不住很正常。慢慢来。
作者回复: 汇编代码往右拖😂,我也看不懂机器码,哈哈
作者回复: 其实基本上都是C语言。python呢就当伪代码看吧,你看最后结尾的吊打面试官里,其实也是伪代码。自己转换成可执行的C或者Java代码是个很好的练习哦。
作者回复: 嗯,是我。