栈的行为分析
💡
原文中文,约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寄存器用于提供稳定的参考点,确保正确的栈帧恢复和函数返回。
栈的创建和释放是如何进行的?
栈的创建和释放通过特定指令完成,函数调用时压入返回地址,函数结束时弹出返回地址。
➡️