🚀 优质资源分享 🚀
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
目录* [二进制漏洞]栈(Stack)溢出漏洞 Linux篇
+ 前言
+ 堆栈
- 堆栈(Stack)概念
- 堆栈数据存储方式
+ 函数调用
- 函数调用C语言代码
- 函数调用过程GDB调试
- 函数Call返回原理
+ 函数栈帧
- 函数栈帧描述
- 函数栈帧调试
+ 栈溢出漏洞实战
- pwndbg调试
- 开始Hack
+ Pwn菜鸡小分队
[二进制漏洞]栈(Stack)溢出漏洞 Linux篇
前言
我们在学习栈溢出漏洞之前,最好都要懂一些开发,还有一些汇编知识,因为不管是安全还是逆向,这些都是基于开发的,有了开发扎实的基础在后续中才会突破瓶颈。
堆栈
推荐大家可以先去看看《王爽汇编》,或者直接看Bilibili的堆栈是个啥?
堆栈(Stack)概念
首先来了解下什么是堆栈?我们得从CPU开始说起,CPU中有个模块叫ALU
,专门用来处理数据运算。
学过汇编的小伙伴们都知道,CPU中有多个寄存器,不过是固定的,比如eax、ebx、ecx、edx、ebp、esp、edi、esi、eip
等,当处理的数据过多或者过大时候,寄存器都不够用了,这时候怎么办?
增加CPU的寄存器吗?不行那样成本太大了,所以就需要找另外的地方存数据,那么硬件中读取速度除了CPU,也就内存条速度最快了。
所以CPU招募了内存条,来用来存储数据,在内存条中还专门找了个区域用来存数据即:堆栈(stack)
,说白了堆栈就是一块内存
。
堆栈数据存储方式
我简单的画了一个堆栈示意图,堆栈是一个自高地址向下增长的内存空间
,从图中可以看到我们的高地址,也就是栈底,而低地址大概4个空格的位置是栈顶。
也就是记住地址越低是栈顶,而且堆栈中要添加数据,地址要往跟低的地址移动。
接下来我们继续来看看,如何在堆栈中存取和读取数据,他既然是块内存,那么我们关注的肯定是存取和读取,首先堆栈中存入数据叫push
,读取数据叫pop
。
堆栈管理数据的方式是先进后出
,即存取进去的数据,会在堆底,最后存取进去的数据会在栈顶,所以最先拿出来的数据也是最后放进去的即栈顶。
这里有个需要注意的地方,就是很多人以为pop数据后,堆栈里面的数据就清空了,其实并不是。
之前说过堆栈其实就是一块内存,当我们pop后,其实知识把栈顶往下移了而已,内存里面的数据还是在的,并没有被清除掉,只是对于堆栈而言,那数据被弹出。
当要push新数据,push很多个数据,或者pop很多个数据,都按照图示以此类推。
函数调用
函数调用C语言代码
学习堆栈最