栈1——栈攻击

前言
第一,需要熟悉栈帧结构。 不同架构不同系统的不同的编译优化选项导致栈帧结构有所不同。比如加了某编译选项,%rbp可以不入栈。比如linux下栈帧是向下增长的,进程的主线程栈在进程的虚拟地址空间的栈区,普通线程栈是运行时库(glibc/uclibc/eglibc/musllibc等)在堆区开辟的,但都是向下增长的。
第二,熟悉入栈出栈汇编指令及流程。 比如变量放时,汇编假设是movl #0(-10)%rbp那么放就是从rbp-10的的地方,往上放的,而不是往下的,linux下栈是向下增长的。你取变量值的时候是地址++取的而不是–的。
第三,需要知道被攻击程序的汇编代码(非必须项)。 一般开源项目容易受到攻击是因为开源导致你可以对该项目的程序进行反汇编,这样通过汇编就能对该程序的栈帧结构有精准的掌控,可以有针对性的进行攻击(栈攻击只是其中之一)。不开源的项目,攻击反而需要很多次的“猜”。

接下来是栈帧结构被破坏的一些情况,最后看如何进行栈攻击的。
1.变量被淹没
比如在函数中先定义一个flg局部变量,再定义一个局部变量other,当对other进行memset清零的时候要小心了,如果长度太长会把flg变量给覆盖,导致flg变量被改变,从而导致程序流程改变。比如linux下,flg先入栈放到高地址,other后入栈放在低地址上的,memset把other清0的时候,长度给它写很大超出other的地址空间范围,又因为memset的地址是++往上走的,那么长度超出一定单位就能++到flg的地址空间,那么你本来是改other的内容,但反而把flg变量改了,如果flg变量决定程序的流程,那么表现就是你改other变量后却导致整个程序的行为发生巨大改变。

2.rbp被淹没
和1一样,达到rbp,越它就会段错误。
当然覆盖rbp的内容是可以写入不非法的地址,就不会出现段错误了。
但如果开启某个编译选项导致寄存器%rbp不入栈了咋办?不知道。

3.栈攻击
执行想要执行的程序。
思路: 找到存放LR的栈地址,把其内容改成你想要执行的代码地址。
找到LR栈地址在哪需要摸清该程序的栈帧结构。linux下的栈帧结构简单描述如下(可网络搜索):
上一栈帧rbp
其他
入参(从右至左)
LR
新栈帧rbp:
其他
等等。
可见linux下A函数调用B函数时,B函数的最左边的形参的栈地址的下一个就是LR地址。

近期阿里发现的开源漏洞,先报给美国而被罚,那漏洞就可以通过shellcode而获取到系统权限,执行自己的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值