在WinDbg中,k
或kb
命令展开堆栈并生成堆栈跟踪。输出看起来像这样-
ChildEBP RetAddr Args to Child
0021b2f0 559fdbf2 04b885a0 02a30000 5a675a79 <some_symbol>
0021b3dc 559fc3b8 02a3d0b8 0021b4c0 00000000 <some_symbol>
据我所知,EBP是指向当前堆栈帧起始地址的基本指针。
RetAddr
是“返回地址”,一旦当前函数返回,处理将恢复。但是,据我所知,功能框架被压入堆栈。那么,为什么RetAddr
的值与ChildEBP
的值明显不同?因为我们在同一堆栈上工作,所以它们应该相似。我想念什么吗?
最佳答案
EBP所指的地方实际上是存储器的“数据”部分。您可以对其进行读写。
在此情况下,返回地址将指向内存的代码部分。这部分是只读的。
是的,它是相同的堆栈,但是存储器的两个不同部分。想象一下,如果您可以写入代码部分,那么黑客将恶意代码轻松地注入(inject)到代码段中将非常容易。
这个link有相关的细节