本次教学节选于星梦安全团队在Bilibili上发表的视频

url为 https://www.bilibili.com/video/BV1Uv411j7fr?p=7
所有内容作者手打 如有错误请指出
如有侵权请联系本文作者

栈 -- 一个对于pwn学习者最熟悉不过的东西了

在上节课的学习中 我们学习了Pwn关于Shellcode编写的内容


而在本次的学习中 我们会学习不同关于栈&栈溢出的知识

0x01 栈溢出的背景

想要学栈溢出 那我们首先要把基础学好吧 我们先简绍下栈溢出所需要的背景知识

在这样了 我们想要知道什么是栈溢出 那么我们必须要知道什么是栈;栈

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据, 先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针

可以这样说 栈是一个保留数据的地方 其中 比较重要的概念有两个 分别是Push和Pop
顾名思义 push是把数据退入栈中 而Pop是把数据压出栈
POP&PUSH

函数调用栈

函数调用栈 是指一个程序在运行过程中一段连续的区域 也就是在C语言中 调用函数的时候需要创造一个栈帧 用来存放被调用函数的局部变量 也会保存被调用函数的之前状态 当被调用函数调用之后 会从栈中将之前保存的运行状态恢复(寄存器的值)
函数调用栈
(还有一个eip 忘加了)
一般的函数一般会涉及到三个重要的寄存器 分别是ESP EBP 还有 EIP 他们代表的都是不同的地址(指针
结构
ESP ESP寄存器是储存函数调用栈的栈顶地址
EBP EBP寄存器保存的是函数调用栈的栈底地址
EIP EIP寄存器保存的是函数调用栈的即将使用的命令的地址(通过偏移)
在不断的压入栈的过程中 ESP的值会不断的减少 因为在不断的从高地址到底地址移动
像基地址,返回地址这些构造出了调用函数的状态

0x02 栈溢出原理

在学习完成栈溢出的所需要知识储备后 我认为这一定对你后面的原理会理解的很快(坚信)别忘了 我也在和你一起学呢!

首先我们要知道 我们的攻击是通过修改函数的状态实施攻击的 所以说 我们是无法在程序执行指令的过程中开始攻击的 我们只可以在调用函数之前或者之后开始攻击

到底什么原理!!!???

铺垫说了一大堆 现在终于到了揭晓方法的时候*其实我们的方法很简单。。。。
那就是。。。。。。
(喝水)
哎~下期说吧

哈哈 我不皮了 相信聪明的读者已经猜到了吧 其实 我们攻击的方法就是通过修改寄存器EIP的值 来让eip指向我们攻击地址的指令 哦不对 是攻击的指令的地址
我的理解
那么我们怎么做到呢 首先我们要知道栈溢出是指栈上的缓存区被填入了过多的数据,超出了边界 导致栈上原的数据被覆盖

0x03栈溢出漏洞利用

首先 我们来看一串代码

int this_is_an_overflow()
{
    char buf[8]  /*定义*/
    read(0, buf, 16)
}

首先 这串代码看着没错对吧 其实 它存在一个栈溢出漏洞
首先 我们可以看到 我们给缓存区定义的时8个字节 而我们咱read函数这儿已经读入了16个字节了 所以 这会导致严重的栈溢出
原理图

如果此时我们在程序中输入aabbbbccccdddd的话 栈就会就会产生类似的画面 当这个函数执行完成后 this_is_an_overflow函数会返回指向dddd的这个地址 也就是0x64646464 因为64是d(小写)的ASCII码

|Bin |Oct |Dec |Hex |符号|
| 0110 0100 | 0144 | 100 | 0x64 | d |

那么我们就可以知道 只要我们篡改函数的返回地址为我们的Shellcode地址 那么我们就pwn

0x04 总结

Emmm 好像也没什么说的了 反正只要你认证阅读过文章 你也应该没啥困惑了 记住一个小贴士:
只要看到没有对用户输入的内容做限制的 必定有Stack Overflow!!!

最后修改:2021 年 04 月 07 日 05 : 31 PM
如果觉得我的文章对你有用,请随意赞赏