--------- | ret_addr| |---------| | ebp | |---------| 我们再看一下第二条指令,mov %esp , %ebp , 初始化当前函数栈帧。最终结果如下 --------- | ret_addr| | |---------| | | ebp |---/ |---------|<--| | ... | | |---------| | | ret_addr| | |---------| | | ebp |---/ |---------|<--| | ... | | |---------| | | ret_addr| | |---------| | | ebp |---/ |---------|---|
所以我们只要知道当前%epb的值,就可以通过上面那种图示方法进行调用栈分析了。有人会问为什么libc有函数实现了,自己就没有必要了,但libc只提供获取当前线程的调用栈信息,有些时候需要获取其他线程的调用栈信息,这个时候就需要自己分析实现了,总体思路一样,只需要获取到其它线程的%ebp信息即可,但通常情况在用户态是不能够获取%ebp寄存器的,可以借助内存模块来实现。
下面写的一个小程序,一种方法使用libc库里面backtrace函数实现,还有一种就是自己通过分析调用栈信息来实现。