栈的行为分析

💡 原文中文,约8200字,阅读约需20分钟。
📝

内容提要

本文介绍了栈的基本概念及其在函数调用中的作用,包括栈的创建、释放、特性和保护机制。栈采用后进先出(LIFO)结构,存储局部变量和返回地址。文章还讨论了栈溢出及其绕过保护机制的方法,如Stack Canary和NX/DEP,并通过实例分析栈溢出漏洞的利用过程,强调保存主调函数的ebp以确保正确的栈帧恢复和函数返回。

🎯

关键要点

  • 栈的基本概念是后进先出(LIFO)结构,存储局部变量和返回地址。
  • 栈的创建与释放是函数调用与返回的本质,栈帧的建立和释放通过特定指令完成。
  • 栈的特性包括空间小、效率高,由系统自动管理。
  • 栈溢出是由于调用函数过多或申请超大局部变量造成的。
  • 栈的保护机制包括Stack Canary和NX/DEP,前者通过随机值检测栈的完整性,后者通过标记内存页为不可执行来防止代码注入。
  • 绕过Stack Canary的方式包括信息泄露、覆盖非地址数据、逐字节爆破和劫持__stack_chk_fail。
  • NX/DEP的绕过方式包括ROP、JOP/COP、ret2libc和修改内存保护属性。
  • 栈的主要作用是保存函数调用现场、局部变量和返回地址。
  • 函数调用时,返回地址被压入栈中,程序执行完后可以跳转回主调函数。
  • 栈帧结构和栈回溯通过保存的ebp值实现,便于调试和异常处理。
  • 栈溢出漏洞的利用过程包括覆盖返回地址以执行攻击者的代码。
  • ebp寄存器的作用是提供稳定的参考点,确保正确的栈帧恢复和函数返回。

延伸问答

栈的基本结构是什么?

栈的基本结构是后进先出(LIFO),用于存储局部变量和返回地址。

栈溢出是如何发生的?

栈溢出通常是由于调用函数过多或申请超大局部变量造成的。

Stack Canary的作用是什么?

Stack Canary用于检测栈的完整性,通过在返回地址之前存放随机值,若该值被改变则终止程序。

如何绕过Stack Canary保护?

可以通过信息泄露、覆盖非地址数据、逐字节爆破和劫持__stack_chk_fail等方式绕过Stack Canary。

ebp寄存器在栈中的作用是什么?

ebp寄存器用于提供稳定的参考点,确保正确的栈帧恢复和函数返回。

栈的创建和释放是如何进行的?

栈的创建和释放通过特定指令完成,函数调用时压入返回地址,函数结束时弹出返回地址。

➡️

继续阅读