linux 栈溢出攻击原理,栈溢出攻击系列:shellcode在linux x86 64位攻击获得root权限(五)栈溢出原理...

在前面的系列中,已经提到了方法调用关系中栈空间是如何布局的,而造成栈溢出的主要原因是有些函数没有越界检查,最后导致了栈的溢出,也就是栈的空间被人为的重新布局。大家重新在看这张栈的图

0818b9ca8b590ca3270a3433284dd417.png

方法A调用方法B, 当B方法执行退出的时候,首先rbp指针指回方法A的函数入口地址,然后把rip 赋值到返回地址也就是当A call B的地址,而在图上返回地址就在B方法的调用栈的上方(栈是从高位到低位分配的),那么只要覆盖栈到返回地址,替换成自己想要的返回的地址,那么rip指针将会指向你想执行的代码,最后达到攻击的目的。

这样我们需要2个重要条件

1. 能在栈上直接分配空间的

2. 覆盖的时候是从地址的低位到高位复制

这样的结构是否是非常眼熟,那就是我们常用的数组。

数组的分配

char[10] 数组

栈空间

内存低地址 RSP ------------------------------| RBP|返回地址 内存高地址

char[0]char[1]..char[10]

也就是如果复制一些内容越界到char[11] char[12]char[13]char[14]... char[18] 8个数组的话(这是rbp的内容,在64位地址中是8个byte),那将覆盖返回地址,也就是我可以指定接下来eip的指针的内容,执行我想执行的代码,运气很不错当覆盖rbp的地址的时候,并没有检查他的有效性,那么我可以从容的覆盖rbp 直到覆盖返回地址。

但实际情况gcc 在编译的时候,为了读取效率会缓存对齐而额外分配一些空间,那么你可能要多覆盖点空间才可以,这是计算的问题不是难点。

那什么样的函数能做这样的事情呢?

很容易我们会发现一些不检查越界的函数,比如strcpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值