【PWN · ret2libc】ret2libc1

news2025/1/16 7:45:21

ret2libc的第一题

目录

前言

一、动态链接

二、ret2libc原理

三、exp编写

干货 

干货一:python下的ELF 

干货二:strings看看有没有待选字符串

编写exp

总结 


前言

本来是和学习ret2text\ret2shellcode\ret2syscall一样在网上找文字资源,读博客,however~~

机缘巧合我又一次打开了大一曾经浏览过的bilibili上的PWN入门教程,然后发现大一看来晦涩难懂的东西,在浅浅学了几门专业课后(事实上正在学),发现竟比较“简单”能理解;大一看来gdb用的天花乱坠很难得样子,现在看来也无非是start/run/b main/next/continue/q/pattern create xx等等调试指令。

所以就跟着张剑威老师一起学。比较其他课程,每一节课程都3h,真的很细!!!对新手其实真的很友好!!(有一点点汇编知识即可)强推!!

其他b站大学的课程还没看,但是目前还是萌新,打基础的话,还是3h的课程比较爽捏(开插件2.4倍速看,贼爽)


一、动态链接

这里还是简单复述一下原理。更加详细的可以去看视频(太详细了而且易懂)。

我们都知道,ret2syscall一般适用场合是静态链接。和动态链接不同的是,在一开始编译一个c语言程序,就将所有的库函数都打包到最终的elf可执行文件中。而动态链接编译后的文件,很明显大小小于静态链接后的文件,是因为有大量的调用库函数,都只是在程序中做了标识,而没有一股脑儿把所有的函数体囊括进来。

这张图很好地说明了动态链接下程序执行的过程。

我们主要需要知道的是:

        当函数运行到调用库函数时,程序将访问对应函数的plt表项,plt表项存着代码,代码分为两部分:        

        第一部分,跳转到对应的got表。

        第二部分,查找函数的真实地址,修改got表内容。

        got表项存着一个地址。然而这个地址并不一开始就是libc中函数的真实地址。

        一开始,got表项中地址指向plt代码的第二部分。

        后来,因运行plt第二部分代码段,got表内容被修改为真实函数地址。

依据以上,我们可以直到动态链接下,程序的特点:

        第一次访问函数时,寻找到函数的真实地址,然后调用;第二次访问时,直接通过函数的真实地址进行调用。

因为程序运行实则把控制流交给了libc中的代码,因此动态链接下的可执行文件,成功进行了瘦身——需要的东西,找别人借,无需自己拥有。 

二、ret2libc原理

我们在ret2syscall,可以通过静态链接所囊括大量库函数因而存在的大量gadget,组成我们想要的后门函数。而动态链接下的文件,其中没有库函数的函数体,而只有函数的标志信息。那么我们怎么进行栈溢出攻击呢?

首先前提肯定的,我们可以通过一个危险函数,劫持函数控制流。然而给我们这个地址,我们该怎么做呢?填什么地址呢?

以本题为例,本题中通过IDA可以找到一段system()函数,这段函数放在一个几乎不可能被执行的语句内,那么就没有用了吗?——不是的

system()在函数中出现(尽管几乎不会被执行),就意味着plt中有它的表项!!

而我们之前说过了,虽然没有囊括system的函数体,我们可以返回到system@plt的指令段,然后借此跳转到got表项指向的地址,即函数地址,实现对system函数的调用。 

所以我们溢出时,将控制流劫持到system@plt指令段,就相当于调用了system函数。而我们继续要做的是,继续溢出,在栈上填充我们需要的信息,具体来说是system的参数。

大致如图所示 。那么怎么是这样排布的呢?具体我们接下来看。

我们知道,函数嵌套,会在栈上开辟新的栈帧,而被调函数(callee)的参数放在哪里呢?主调函数(caller)和被调函数的栈帧是怎么样的呢?

上面大致画了一下主调被调函数栈帧的关系,值得说明的是,中间三个栈空间画的比栈小仅仅是为了说明这三个栈空间的“归属”问题:arguments和ret_addr由caller保存,prev_ebp由callee保存。 

因此,我们发现,假设callee是system函数,那么它寻找其参数,就要向栈底偏两个栈空间(越过ret_addr和prev_ebp找到arguments)。那么理论上我们溢出构造的栈内容直观上应该是这样的:

然而实则不正确,应该是:

为什么呢?因为上上上张图已经故意说明了,prev_ebp是由callee进行保存的,许许多多的函数(包括system)在被调用时的第一句指令,总是push ebp,因此有一个我们只需要给出一个虚假的ret_addr就行了,callee会自动往栈上压入ebp。

这里不得不提一个情况(实则很少见)那就是main和system中间还有一个函数的调用,这样不就打破栈的平衡了吗?强推b栈视频,老师在面对这个学生突然提出的问题时,解答十分精彩,给出了通用的溢出结构!

无论中间夹杂多少个函数,在shellcode中添加pop_ret即可完美衔接,具体看视频叭! 

好了,开始上手!而且老师也给出很多做题干货,例如,接下来,我将不用IDA,而是分享几个实用的姿势。

三、exp编写

首先提炼一下我们要做的事情:、

  • system函数地址,确切说是system@plt的地址
  • "/bin/sh"地址,补充一下,这种字符串,都是程序力单独开辟空间存储的,作为参数实则是字符串地址;如果程序中没有,那就要用其他高级手法,but我还是萌新,不会。
  • 老生常谈的偏移量

干货 

干货一:python下的ELF 

>>>python3
>>>from pwn import *
>>>io=process("./file_name")
>>>elf=ELF("./file_name")
>>>system_plt=elf.plt["system"]
>>>system_plt
134513760
>>>...

不用checksec也能知道其信息,经过这些操作找到system@plt的地址了。任务一完成。

解释一下,next()是因为python3相对于python2有所改动(返回值的类型),b"/bin/sh"是指在字节中类型的字符串,因为是在二进制文件中找是都是字节嘛。

找到/bin/sh的地址,任务二完成。

上述几个实际上都可以在IDA中完成,但是能用键盘,为什么要用鼠标呢? 既不用checksec,而且可以快速找到字符串、找到plt地址,也可以找到got表项的地址信息。

干货二:strings看看有没有待选字符串

strings file_name | grep /bin/sh  #查看file_name文件中是否存在字符串 "/bin/sh"

如果下一行打印出了该字符串,说明存在该字符串。

编写exp

直接附上exp,关于offset,简单的用pattern就可以了,可以看这里

from pwn import *

io=process("./ret2libc1")

bin_sh=0x8048720
system_addr=0x8048460
offset=112
payload=b'a'*offset+p32(system_addr)+b'aaaa'+p32(bin_sh)

io.sendline(payload)

io.interactive()

 成功获取自己的shell。


总结

只能说,现在好喜欢看张剑威老师的课程(这样叫可能把他叫老了,他应该本科才刚毕业,确实牛,膜拜%%%%%),争当“刘勇”,加油!

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

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

相关文章

28从零开始学Java之面向对象和面向过程到底有哪些区别?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 壹哥相信,经过你对前面文章中技术点的学习,现在的你应该已经对Java具备了初步…

【UE】直升机沿样条线移动

效果 步骤 1. 将虚幻商城中的免费资产导入工程 下载完毕后可以看到如下文件 2. 新建一个Actor蓝图类,命名为“Track”,这个蓝图就是用来画样条线的 打开“Track”,添加样条组件 3. 打开“BP_West_Heli_AH64D” 在事件图表中先新建一个时间轴…

Unity冷知识:读取用户输入应该写在Update还是FixedUpdate里?

Unity冷知识:读取用户输入应该写在Update还是FixedUpdate里? 版权声明: 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明文章内容,不得删减、修改、演绎相关学习资源见文末 一些人…

1.SpringCloud技术

SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

初识C++之线程库

目录 一、C中的线程使用 二、C的线程安全问题 1. 加锁 2. 变为原子操作 3. 递归里面的锁 4. 定时锁 5. RAII的锁 三、条件变量 1. 为什么需要条件变量 2. 条件变量的使用 2.1 条件变量的相关函数 2.2 wait函数 一、C中的线程使用 线程的概念在linux中的线程栏已经…

9个加密货币交易所被查封,交易所安全审计后仍不安全

美国联邦调查局和乌克兰警方查封了九个加密货币交易网站,这些网站为包括勒索软件参与者在内的诈骗者和网络犯罪分子洗钱提供了便利。 联邦调查局 FBI 在其公告中表示,该行动是在虚拟货币响应小组、乌克兰国家警察和该国法律检察官的帮助下进行的。 此次…

ai皮带跑偏撕裂监测算法 yolov7

ai皮带跑偏撕裂监测系统算法基于yolov7网络模型人工智能视觉技术,ai皮带跑偏撕裂监测算法模型自动识别现场画面中传送皮带撕裂、跑偏、偏移等情况,立即告警抓拍存档同步回传后台。YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图…

Git入门学习

Git是什么? 是一种免费开源的分布式版本控制系统,区别于集中式挂历系统(SVN,CVS)的是分布式每人都有一个“档案馆”,而集中式是只有一个“档案馆”。 这样的话,如果你使用git进行开发,感觉自己…

多层PCB层叠结构

在设计多层PCB电路板之前,设计者需要首先根据电路的规模、电路板的尺寸和电磁兼容(EMC)的要求来确定所采用的电路板结构,也就是决定采用4层,6层,还是更多层数的电路板。确定层数之后,再确定内电…

全景丨0基础学习VR全景制作,平台篇第18章:热点功能-音频

大家好,欢迎观看蛙色VR官方——后台使用系列课程! 功能说明 应用场景 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多元化体验。 音频热点,即点击热点后会直接播…

低代码开发重要工具:jvs表单动态字段配置方式

在表单中常常会有动态字段的场景,也就是如下图所示,根据一个字段的内容选项去控制另外字段的内容展示 配置的思路:根据第一个单选框选择的内容,通过关联筛选的方式去选择第二个单选框的内容,那么第二个单选框的物理存储…

K8s基础7——DaemonSet控制器、Job批处理调度、Cronjob定时调度

文章目录 一、DaemonSet二、Job三、Cronjob 一、DaemonSet 控制器介绍: DaemonSet 可以确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会给这新节点新增一个 Pod 。当有节点从集群移除时,此节点…

redis最大连接数查询与设置

redis客户端连接数 redis通过监听一个TCP端口或socket的方式接收来自客户端的连接, 当与客户端建立连接后,redis内部会进行如下操作: (1)客户端socket会被设置为非阻塞模式,因为redis在网络时间处理上采用的是非阻塞多路复用模…

基于JavaWeb实现的汽车维修管理系统

【简介】 本系统基于springboot mybatis jps架构开发,前后端分离,开发环境为jdk1.8、mysql、maven。系统功能主要分为汽车维修管理、配件管理、财务管理、基础数据管理、系统维护5大模块。 【功能结构】 【技术架构】 系统架构:springboot …

不会做大数据实时计算?10年数据分析师整理,一文给出解决方案

本文分为四个章节介绍实时计算,第一节介绍实时计算出现的原因及概念;第二节介绍实时计算的应用场景;第三节介绍实时计算常见的架构;第四节是实时数仓解决方案。 一、实时计算 实时计算一般都是针对海量数据进行的,并…

RISC-V OS(老师的OS) 基于 汪辰老师的视频笔记

前言 最后面没写完,以后再补。。。 RISC-V OS RVOS 介绍 操作系统定义 操作系统(英语:Operating System,缩写:OS)是一组系统软件程序: 主管并控制计算机操作、运用和运行硬件、软件资源。提…

[oeasy]python049_帮助手册_pydoc_manual_document

帮助手册 回忆上次内容 上次了解了注释 注释是为了让程序更可读注释不会影响程序运行速度 注释分为两种 单行的 以#开头不能是字符串当中的# 多行的 三个"三个 多行注释还有什么特殊功能么?🤔 增加描述说明 #!/usr/bin/python3 #vim: set file…

技能梳理38@stm32+CC2530+超声波+光敏+oled

技能梳理38stm32CC2530超声波光敏oled 1、项目简介 2、实现逻辑 #主从机使用zigbee通信 #主机oled显示当前停车场位置图 #从机通过超声波和光敏一起检测是否有车 #当某位置车辆进出,在主机上oled进行提示 3、应用场景 #车辆无线检测 #货架商品有无检测 4、核心…

UWA Pipeline 2.4.2 版本更新说明

UWA Pipeline是一款面向游戏开发团队的本地协作平台,旨在为游戏开发团队搭建专属的DevOps研发交付流水线,提供可视化的CICD操作界面、高可用的自动化测试以及UWA性能保障服务的无缝贴合等实用功能。 在本次2.4.2版本更新中,我们对Pipeline的…

【Java+GS】GeoServer,通过配置自定义样式,实现不同图斑展示不同颜色。附java实现方法

文章目录 客户端发布样式一、[GeoServer中使用SLD样式](https://www.cnblogs.com/tuboshu/p/10752292.html)二、分属性渲染三、客户端操作发布图层 掌握使用java api 发布样式一、前置准备二、发布图层三、发布工具类 设计从数据库字段自定义样式一、数据库设计二、业务逻辑分享…