
栈
探索栈
云会宾
云无心
展开
-
对递归新的理解
了解了进程栈、线程栈、函数栈和进程代码段的基础知识(可参见我的相关博客)之后,自然对递归函数会有新的理解:递归就是数据不同,但是处理相同,栈记录不同的数据,代码段是同一份。——这也是递归可以改成for循环的原因。递归函数执行时,会不断调用自身直到出口才停下来。每一次调用自身函数都会开辟一个栈空间,把不同的数据存下来,所以我说栈记录不同的数据。而这开辟栈的操作都是同一份代码,就好像在原地转圈圈,但是开辟了很多栈空间,等到递归回来的时候又毁灭掉一个个的栈空间。.....................原创 2022-08-06 17:59:45 · 215 阅读 · 0 评论 -
栈2——局部变量要初始化的原因
同一个线程的所有函数共享同一个栈地址空间,所以同一个线程的一个函数中局部变量不初始化就用的话,上个函数用完这个栈,系统并没有把这个栈清0,导致下个函数的局部变量压栈用的栈地址是上个函数的栈地址——局部变量的值就不确定了——俗称垃圾值。所以函数中局部变量用之前要初始化。...原创 2022-01-12 10:34:17 · 597 阅读 · 0 评论 -
栈0——栈帧
栈帧就是函数或者线程在运行时在栈上开辟的一块空间,用来保存cpu寄存器、局部变量等内容的。所以分为函数栈与线程栈,实质它们都是栈,一样的。函数栈是函数用的,线程栈是给线程用的。为何有栈呢?因为cpu的寄存器不够用,人他妈的太聪明了,正好用栈记录下,这样入栈出栈,保存和恢复cpu各寄存器的值。每个线程其实就相当于一个函数,只不过一般线程是一个无限循环的函数。因此每个线程都有一个线程栈。创建线程的时候线程栈会初始化为默认的cpu寄存器值。等到线程正常退出时会调用默认的一个函数来做清理工作之类的。线程的运行原创 2021-11-16 20:36:45 · 160 阅读 · 0 评论 -
栈1——栈攻击
越界溢出时。比如变量放时,汇编是movl #0(-10)%rbp那么放就是从rbp-10的的地方,往上放的,而不是往下的,linux下栈是向下增长的。你取变量值的时候是地址++取的而不是–。1.变量被淹没比如flg变量,被memset其他变量的时候给覆盖,导致flg变量,导致程序流程改变。2.rbp被淹没和1一样,达到rbp,越它就会段错误。3.攻击,执行想要执行的程序思路:找到返回的栈地址,改成想要执行的代码。...原创 2021-12-30 19:49:29 · 751 阅读 · 0 评论