Assembly 是否有任何措施可以防止程序集中的堆栈溢出?

Assembly 是否有任何措施可以防止程序集中的堆栈溢出?,assembly,x86,stack,theory,Assembly,X86,Stack,Theory,在汇编语言编程中,有什么(如果有的话)可以阻止堆栈增长,直到它破坏数据或指令?只有CPU/MMU配置(通常由操作系统完成)可以防止或拦截堆栈溢出和内存损坏,或者在没有必要权限的情况下尝试访问某些内容 您可以阅读Intel/AMD x86 CPU手册中有关内存管理的章节,以了解更多信息 什么(如果有的话)阻止堆栈增长和破坏数据 还是说明 你!在装配中进行编码时,绝对没有手握。您必须确保所有值都适合它们的缓冲区,所有指针索引都在范围内。在堆栈上保留空间,确保任何东西都适合该缓冲区。在使用汇编时,您负

在汇编语言编程中,有什么(如果有的话)可以阻止堆栈增长,直到它破坏数据或指令?

只有CPU/MMU配置(通常由操作系统完成)可以防止或拦截堆栈溢出和内存损坏,或者在没有必要权限的情况下尝试访问某些内容

您可以阅读Intel/AMD x86 CPU手册中有关内存管理的章节,以了解更多信息

什么(如果有的话)阻止堆栈增长和破坏数据 还是说明


你!在装配中进行编码时,绝对没有手握。您必须确保所有值都适合它们的缓冲区,所有指针索引都在范围内。在堆栈上保留空间,确保任何东西都适合该缓冲区。在使用汇编时,您负责编程的各个方面。

99.99%的堆栈溢出原因是程序错误或程序设计错误

现在我们有两个基本但不属于本主题的问题:

1) 如何防止汇编中的bug

2) 如何做好程序设计

您可以直接在堆栈的接受下限下使用,并不断检查金丝雀的值


在内核和代码(环0)中,您还可以通过将调试寄存器之一的值设置为断点地址的线性地址,直接位于堆栈的可接受下限之下,然后设置寄存器的正确标志位,将调试寄存器
dr0
dr1
dr2
dr3
的值设置为,并在断点处理程序代码中报告或尝试修复该情况。请参阅。

。。。汇编语言编程中没有编译器。。。你是说汇编程序吗?(据我所知,汇编程序只是简单地将助记符转换成机器代码,在此过程中很少进行结构检查。)to Assembly=将某些东西组合在一起。。。编译=到。。。嗯。。。把东西放在一起???区别在于“把东西放在一起”的程序的复杂性。汇编程序比编译器简单得多。据我所知,汇编程序不会做很多检查。我想这可能就是答案……;)这是一种有趣的方法(额外的代码保护层)。谢谢。是的,尽管我特别要求了解是否有任何机制可以防止堆栈溢出、bug和糟糕的程序设计。经过进一步调查,x86 CPU手册非常丰富。。。您是否有任何参考资料或关键字可以更直接地指向您所指的材料,即操作系统有何帮助以及如何帮助?英特尔64和IA-32体系结构软件开发人员手册,第3A卷:第3章“受保护模式内存管理”、第4章“分页”、第5章“保护”和第6章的某些部分“中断和异常处理”。通常,操作系统帮不了什么忙。它永远无法“理解”一个程序并“修复”它。它只能注意到发生了严重错误并终止有问题的进程。有时,进程可以通过请求操作系统将异常处理重定向到进程本身来进行干预(请参阅Windows中的结构化异常处理(SEH)。但这对堆栈溢出不太有效,因为如果没有更多的堆栈,进程内异常处理程序将无法执行任何有意义的工作或恢复,因为它需要一些堆栈,而没有堆栈。操作系统干预能力有限是有道理的。任何操作系统干预都必须通过超级用户类型的看门狗进程,该进程对于每个程序来说,监控堆栈等都是非常具有侵入性的。可能是枪手回答“程序员”,而使用金丝雀(由nrz建议)等技术是解决方案。我将查看您列出的章节。我假设操作系统可以(而且通常会)在堆和堆栈之间的地址范围中留一个间隙。因此,访问该间隙中的数据的用户空间进程将导致页面错误,该错误可能会以调用分段错误信号处理程序的形式报告回应用程序。