c语言栈溢出的原因及解决办法_栈溢出基础

本文详细介绍了C语言中栈溢出的概念、基本原理,并通过实例展示了如何利用栈溢出来调用目标函数。内容涵盖缓冲区溢出的基础知识,函数调用栈的工作原理,二进制表示以及栈溢出的Demo分析,同时提供了利用GDB计算偏移地址的方法和防范栈溢出的思路。
摘要由CSDN通过智能技术生成

02e65e8b9cfe4562890d706d85f0b7cc.png

一. 基础知识

    • 什么是缓冲区溢出
      • 在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示

d75c9c38baf90b98ea4fb7caf799e889.png
      • 注意到括号之间的空格是输入用户名的预期空间.那个空间是我们的缓冲.处理用户名后, 返回地址将告知程序需要执行的下一个指令.现在, 如果我们不仅输入用户名, 而且添加其他数据以溢出此缓冲区空间, 会发生什么情况?
      • 不仅如此, 我们键入的是一些 shellcode(一系列计算机指令, 通过示例给我们提供远程 shell), 一些虚拟数据和该 shellcode 的地址, 而不只是键入名字, 而是键入一些 shellcode.程序将遵循我们覆盖的 shellcode 地址而不是正常的返回地址, 而是执行我们的 shellcode, 而不是返回到预期的指令.这是缓冲区溢出攻击.

76dd856715bad14ecd629b88b4a81373.png
    • 函数调用栈在内存中从高地址向低地址生长
    • 函数状态主要涉及三个寄存器EBP, ESP, EIP
      • EBP : 用来存储当前函数状态的基地址, 在函数运行时不变, 可以用来索引确定函数参数或局部变量的位置
      • ESP : 用来存储函数调用栈的栈顶地址, 在压栈和退栈时发生变化
      • EIP : 用来存储即将执行的程序指令的地址, cpu 依照 EIP 的存储内容读取指令并执行, EIP 随之指向相邻的下一条指令
    • 二进制, 十进制, 十六进制表示
      • 二进制 : 101010110B
      • 十进制 : 100
      • 十六进制 : 4E20H, 4e20h, 0x4E20, 0x4e20
    • 小端字节序, 大端字节序
      • 举例来说, 数值0x2211使用两个字节储存:高位字节是0x22, 低位字节是0x11
        • 小端字节序:低位字节在前, 高位字节在后, 即以0x1122形式储存
        • 大端字节序:高位字节在前, 低位字节在后, 即以0x2211形式储存, 这是人类读写数值的方法

8c1b90dba6ab39700b0a3805da4f8a6e.png
        • 一般操作系统都是小端, 而
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值