在WinDbg中,kkb命令展开堆栈并生成堆栈跟踪。输出看起来像这样-

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有相关的细节

10-05 22:44