缓冲区是保留还是从堆栈中弹出

问题描述 投票:0回答:1

只是一个简单的问题,假设我们有以下 C 代码

int hello(){
char arr[16];
scanf("%s",arr);
printf("%s",arr);
return 0;
}
我有一个疑问,当 arr 数组被推入堆栈时,在 printf 语句之后,将调用 left 指令,将 ebp 恢复到 esp ,两者都指向我们在序言开始时推入的旧 ebp 地址,对吧?,主要问题是在函数退出期间在开始时压入的数组 arr 发生了什么,它会保留在那里,还是如果我们在 hello 函数之后调用另一个函数,当另一个函数执行时,数组会保留在堆栈上呢?

assembly binary computer-science 32-bit exploit
1个回答
0
投票

我认为您对“从堆栈中弹出”的含义有误解。

一般来说,堆栈有一个“顶部”,我们只是不关心顶部之外的内容。因此,当我们“弹出”堆栈时,我们只需移动称为“顶部”的指针。无论顶部之外的东西仍然存在,我们只是没有一种简单的方法来访问它。我们不会立即覆盖它,但我们可以随时覆盖它。

请注意,有一些高级/hacky 程序技术,这样我可以在

arr[16]
返回后恢复
hello()
中的内容。但这些都是特定于机器的。他们依赖这样一个事实:直到其他人需要该空间时,
arr[16]
才会真正被删除。当他们确实需要那个空间时,他们就会忽略已经存在的任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.