栈溢出原理 小记 基础中的基础~~

安全Orz 专栏收录该内容
13 篇文章 0 订阅

原文地址:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic-zh/

自己的理解:

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。

两个并行条件:程序必须向被操作栈写入数据&写入数据没有被程序良好的控制!

最典型的栈溢出利用是覆盖程序的返回地址为攻击者所控制的地址,当然需要确保这个地址所在的段具有可执行权限。

PIE(Position Independent Executable):是一个针对代码段.text, 数据段.*data,.bss等固定地址的一个防护技术。同ASLR一样,应用了PIE的程序会在每次加载时都变换加载基址

小端存储:小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

Pwntools:参考链接:https://xz.aliyun.com/t/3944

payload:“有效载荷,有效负荷,有效载重”---------通俗一点讲,在程序的世界里,payload(有效载荷)就是对于接收者有用的数据!

小总结:

通过寻找危险函数,我们可以快速确定程序是否有可能出现栈溢出。

常见的危险函数:

输入:

gets,直接读取一行,忽略'\x00'

scanf,

vscanf

输出:

sprintf

字符串:

strcpy,字符串复制,遇到'\x00'停止

strcat,字符串拼接,遇到'\x00'停止

bcopy

 

确定填充长度:常见的操作方法就是打开 IDA,根据其给定的地址计算偏移。

得到地址的三种方式:

1.相对于栈基地址的的索引,可以直接通过查看 EBP 相对偏移获得

2.相对应栈顶指针的索引,一般需要进行调试,之后还是会转换到第一种类型

3.直接地址索引,就相当于直接给定了地址。

 

一般来说,我们会有如下的覆盖需求

  • 覆盖函数返回地址,这时候就是直接看 EBP 即可。(ebp是在堆栈中寻址用的)
  • 覆盖栈上某个变量的内容,这时候就需要更加精细的计算了。
  • 覆盖 bss 段某个变量的内容。(bss段属于静态内存分配,通常是指用来存放程序中未初始化的全局变量的一块内存区域。)
  • 根据现实执行情况,覆盖特定的变量或地址的内容。

之所以我们想要覆盖某个地址,是因为我们想通过覆盖地址的方法来直接或者间接地控制程序执行流程

  • 1
    点赞
  • 5
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值