如何确定缓冲区是在堆栈还是堆上分配?

逆向工程 艾达
2021-07-05 15:32:59

当我使用静态分析查看 Ida 时,我看到缓冲区传递给函数/函数填充缓冲区中的数据。

我怎么知道这个缓冲区是否在堆栈/堆中分配?

2个回答

如果它的地址高于或等于堆栈指针(esp/rsp),则它在堆栈上,
否则,它在堆上或在前一个堆栈帧上(现在超出范围,不应使用)

如果您想知道但只是查看地址:如果地址以 开头0x7f,则它在堆栈中。
但这可能并不总是正确的,程序可以控制堆栈指针的值并可以决定更改它(不太可能但可行)

如果您想静态查找,则必须检查函数的调用站点并查看缓冲区参数的来源。

您可能必须返回多个层,直到您清楚地看到它在堆栈上(如果传入本地内存区域的地址),或者它来自像VirtualAlloc, malloc, new, 之类的调用HeapAlloc(VirtualAlloc 和 HeapAlloc 是 Windows 特定的 API) ),在这种情况下,内存位于堆上。