![02e65e8b9cfe4562890d706d85f0b7cc.png](https://i-blog.csdnimg.cn/blog_migrate/e6bbe86f30ec45dc1c7b6ff58e273d77.png)
一. 基础知识
-
- 什么是缓冲区溢出
- 在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示
- 什么是缓冲区溢出
![d75c9c38baf90b98ea4fb7caf799e889.png](https://i-blog.csdnimg.cn/blog_migrate/07fac4822bb0366b01d30e9e52d24364.png)
-
-
- 注意到括号之间的空格是输入用户名的预期空间.那个空间是我们的缓冲.处理用户名后, 返回地址将告知程序需要执行的下一个指令.现在, 如果我们不仅输入用户名, 而且添加其他数据以溢出此缓冲区空间, 会发生什么情况?
- 不仅如此, 我们键入的是一些 shellcode(一系列计算机指令, 通过示例给我们提供远程 shell), 一些虚拟数据和该 shellcode 的地址, 而不只是键入名字, 而是键入一些 shellcode.程序将遵循我们覆盖的 shellcode 地址而不是正常的返回地址, 而是执行我们的 shellcode, 而不是返回到预期的指令.这是缓冲区溢出攻击.
-
![76dd856715bad14ecd629b88b4a81373.png](https://i-blog.csdnimg.cn/blog_migrate/999807c10c70221419778fefe2b53f4b.png)
-
- 函数调用栈在内存中从高地址向低地址生长
- 函数状态主要涉及三个寄存器EBP, ESP, EIP
- EBP : 用来存储当前函数状态的基地址, 在函数运行时不变, 可以用来索引确定函数参数或局部变量的位置
- ESP : 用来存储函数调用栈的栈顶地址, 在压栈和退栈时发生变化
- EIP : 用来存储即将执行的程序指令的地址, cpu 依照 EIP 的存储内容读取指令并执行, EIP 随之指向相邻的下一条指令
- 二进制, 十进制, 十六进制表示
- 二进制 : 101010110B
- 十进制 : 100
- 十六进制 : 4E20H, 4e20h, 0x4E20, 0x4e20
- 小端字节序, 大端字节序
- 举例来说, 数值0x2211使用两个字节储存:高位字节是0x22, 低位字节是0x11
- 小端字节序:低位字节在前, 高位字节在后, 即以0x1122形式储存
- 大端字节序:高位字节在前, 低位字节在后, 即以0x2211形式储存, 这是人类读写数值的方法
- 举例来说, 数值0x2211使用两个字节储存:高位字节是0x22, 低位字节是0x11
![8c1b90dba6ab39700b0a3805da4f8a6e.png](https://i-blog.csdnimg.cn/blog_migrate/cf443bbc6426cdcffa512b2ec59f5f67.jpeg)
-
-
-
- 一般操作系统都是小端, 而
-
-