Architecture 调用堆栈内存结构
接下来,我试图学习更多关于调用堆栈架构的知识。在线搜索并没有得到我想要的答案,这可能是因为我不知道该使用哪些关键词。不管怎样,我相信这里有人能帮我 首先,让我们从维基百科的条目摘录开始: 在软件中,当程序写入预定数据结构之外的程序调用堆栈上的内存地址时,堆栈缓冲区溢出发生;通常是一个固定长度的缓冲区 一位同事告诉我,他记得在Linux上,堆栈位于进程“虚拟内存”的最末端,并根据需要向后增长,因此它不是“固定长度缓冲区”。然而,我无法证实这一点。因此,我的问题是:Architecture 调用堆栈内存结构,architecture,memory,multithreading,stack,Architecture,Memory,Multithreading,Stack,接下来,我试图学习更多关于调用堆栈架构的知识。在线搜索并没有得到我想要的答案,这可能是因为我不知道该使用哪些关键词。不管怎样,我相信这里有人能帮我 首先,让我们从维基百科的条目摘录开始: 在软件中,当程序写入预定数据结构之外的程序调用堆栈上的内存地址时,堆栈缓冲区溢出发生;通常是一个固定长度的缓冲区 一位同事告诉我,他记得在Linux上,堆栈位于进程“虚拟内存”的最末端,并根据需要向后增长,因此它不是“固定长度缓冲区”。然而,我无法证实这一点。因此,我的问题是: 在Windows和Linux上是
| start of stack |
| data |
| parameters |
| return address |
| data |
| parameters |
| return address |
| parameters |
| return address | <- might overflow into this region or above
| string data | <- writes to this region ... (look up)
stack head
|
V direction of growth for pushes
...
| end of stack |
| guard page | <- writes to this region cause a segfault
...
| heap |
如果您创建自己的线程,您可以负责创建它们的堆栈(请参见man pthread\u attr
),您可以使用系统建议的大小或设置自己的大小。对于Windows:
0x1000 - Return address
0x990 - Buffer
如果您的代码有错误并在0x990处溢出缓冲区,您将覆盖返回地址。如果攻击者可以导致缓冲区溢出,他们可以将一些代码放入缓冲区,并覆盖返回地址以指向注入的代码。当您的函数返回时,它将跳转到攻击者的代码。因此,“堆栈缓冲区溢出”与我填充堆栈时在Windows中遇到的“堆栈溢出”错误的概念不同,即使用永无止境的递归调用?(Windows调用“堆栈溢出”,而不是“segfault”)。正确。保护页中的segfault被捕获并变为堆栈溢出。
0x1000 - Return address
0x990 - Buffer