如何找出EBP属于哪个堆栈帧

逆向工程 视窗 ollydbg
2021-06-26 14:27:57

我是 RE 的所有主题的新手,所以这个问题可能听起来很简单。在 OllyDbg 上,我看到很多对 EBP 的引用,我无法理解 EBP 属于哪个堆栈帧,因为有很多指向 SS 的指针:

在此处输入图片说明

1个回答

当前 ebp 指向前一个 ebp
并通过推断设置前一个 ebp 的调用

在带有 32 位二进制文​​件的 windbg 中,此脚本将遍历堆栈,您可以在 ollydbg 中的转储中使用 follow 来执行相同的操作

r $t0 = @eip
r $t1 = @ebp
.while (@$t1 !=0) 
{
    .printf "eip = %08x\tebp = %08x\t callee = %y\n" , @$t0 ,@$t1,poi(@$t1+4)
    r $t0 = poi(@$t1+4)
    r $t1 = poi(@$t1)
}

执行脚本

0:000> $$>a< e:\stackwalk.wds
eip = 006a163a  ebp = 0023fa54   callee = calc!_initterm_e+0x1a1 (006b219a)
eip = 006b219a  ebp = 0023fae4   callee = kernel32!BaseThreadInitThunk+0xe (7659ed6c)
eip = 7659ed6c  ebp = 0023faf0   callee = ntdll!__RtlUserThreadStart+0x70 (77d237eb)
eip = 77d237eb  ebp = 0023fb30   callee = ntdll!_RtlUserThreadStart+0x1b (77d237be)
eip = 77d237be  ebp = 0023fb48   callee = 00000000
0:000> k
ChildEBP RetAddr
0023fa54 006b219a calc!WinMain+0x5
0023fae4 7659ed6c calc!_initterm_e+0x1a1
0023faf0 77d237eb kernel32!BaseThreadInitThunk+0xe
0023fb30 77d237be ntdll!__RtlUserThreadStart+0x70
0023fb48 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000>