格式化字符串漏洞研究

合集下载

C语言中的漏洞利用与渗透测试技术

C语言中的漏洞利用与渗透测试技术

C语言中的漏洞利用与渗透测试技术C语言作为一种广泛应用于编程领域的高级编程语言,由于其灵活和高效的特点,被广泛使用于各种软件开发项目中。

然而,正是因为其广泛的应用,C语言也存在一些漏洞和安全隐患。

本文将重点探讨C 语言中的漏洞利用与渗透测试技术,以帮助读者了解并提高对C语言程序的安全性。

一、C语言中的常见漏洞在介绍漏洞利用与渗透测试技术前,我们首先需要了解C语言中的一些常见漏洞类型。

以下是几种常见的C语言漏洞:1. 缓冲区溢出:这是一种常见的安全漏洞,在C语言中由于缺乏边界检查导致。

当程序接收用户输入时,如果没有正确验证输入的长度,可能会导致缓冲区溢出,使攻击者能够执行恶意代码或破坏系统。

2. 格式化字符串漏洞:当程序使用不正确的格式化字符串函数,或者没有正确检查格式化字符串的输入时,可能会导致攻击者通过格式化字符串漏洞读取或修改内存中的数据,造成信息泄露或系统崩溃。

3. 整数溢出:在C语言中,整数的溢出可能导致程序出现未定义行为,为攻击者提供了利用的机会。

例如,当执行算术运算或数组索引时,如果没有正确检查整数边界,可能会导致溢出。

二、漏洞利用技术漏洞利用是指攻击者利用系统或应用程序中的漏洞,通过注入恶意代码或执行特定操作来获取权限或控制目标系统。

以下是一些常见的漏洞利用技术:1. Shellcode注入:攻击者可以通过利用缓冲区溢出等漏洞,将恶意代码注入到目标系统的内存中。

一旦成功注入,攻击者就可以通过控制指令来执行恶意操作。

2. Return-Oriented Programming(ROP):ROP是一种高级漏洞利用技术,通过利用程序中的已存在的代码段(Gadget)来执行恶意操作。

攻击者通过构造特定的ROP链,在不添加新代码的情况下,利用程序中的现有代码来完成攻击目标。

3. 格式化字符串攻击:攻击者可以通过构造恶意格式化字符串,利用格式化字符串漏洞来读取或修改内存中的数据。

这种技术通常用于泄露内存中的敏感信息或执行特定操作。

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法

C语言中常见的安全漏洞及防范方法C语言作为一种广泛应用于系统开发和嵌入式设备的编程语言,虽然具有高效性和灵活性,但在安全性方面却存在一些常见的漏洞。

本文将介绍C语言中常见的安全漏洞,并提供相应的防范方法。

一、缓冲区溢出漏洞缓冲区溢出是C语言中最常见的安全漏洞之一。

当程序试图向一个已经装满数据的缓冲区写入更多的数据时,就会导致缓冲区溢出。

攻击者可以利用这个漏洞来修改程序的执行流,执行恶意代码或者获取敏感信息。

防范方法:1. 使用安全的函数:应该使用安全的函数,如`strncpy`、`snprintf`等,而不是不安全的函数`strcpy`、`sprintf`等。

安全的函数会检查数据长度,避免发生缓冲区溢出。

2. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据不会超出缓冲区的长度。

3. 使用堆栈保护技术:可以使用堆栈保护技术,如栈溢出检测、堆栈随机化等,在一定程度上提高程序对缓冲区溢出漏洞的防护能力。

二、格式化字符串漏洞格式化字符串漏洞是由于未正确使用格式化字符串函数(如`printf`、`sprintf`等)导致的安全问题。

当攻击者能够控制格式化字符串的参数时,就可能导致信息泄露或者任意代码执行。

防范方法:1. 限制格式化字符串的输入:应该限制用户输入的格式化字符串,确保输入的格式化字符串参数是合法且不含恶意代码。

2. 使用安全的格式化函数:使用安全的格式化函数,如`snprintf`等,这些函数会检查参数的有效性,避免格式化字符串漏洞的发生。

3. 程序审计:对于已经存在的代码,应进行定期的程序审计,识别和修复潜在的格式化字符串漏洞。

三、整数溢出漏洞整数溢出漏洞是由于未对输入数据进行正确的检查和验证,导致整数值超出其数据类型范围,从而引发安全问题。

攻击者可以利用这个漏洞来改变程序的行为,执行未经授权的操作。

防范方法:1. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据范围在合理的范围内。

C语言中的安全漏洞利用与渗透攻击

C语言中的安全漏洞利用与渗透攻击

C语言中的安全漏洞利用与渗透攻击在C语言中的安全漏洞利用与渗透攻击方面,需要我们深入了解C 语言的特性以及可能存在的风险。

本文将介绍C语言中常见的安全漏洞类型,以及攻击者如何利用这些漏洞进行渗透攻击。

同时,我们还将讨论防范这些安全漏洞的措施。

一、缓冲区溢出缓冲区溢出是C语言中最常见的安全漏洞之一。

当程序在写入缓冲区时,如果没有对输入数据进行有效的验证和限制,攻击者可以发送超过缓冲区容量的数据,导致溢出。

攻击者可以通过溢出覆盖其他关键数据,例如函数指针或返回地址,从而控制程序的执行流程,执行恶意代码。

防范措施:- 在接收输入数据之前,对输入进行有效的边界检查。

- 使用安全的字符串函数代替不安全的函数,例如使用`strncpy`代替`strcpy`。

- 提高程序的权限,限制攻击者对系统的访问权限。

二、格式化字符串漏洞格式化字符串漏洞是指当程序使用了格式化输入输出函数(如`printf`和`sprintf`)时,没有正确验证用户输入的格式字符串。

攻击者可以通过构造特定的格式字符串,读取或修改程序中的内存内容,甚至执行任意代码。

防范措施:- 使用格式化字符串函数时,应避免使用用户的输入作为格式字符串,而是使用固定的格式。

- 在使用格式化字符串函数时,确保提供足够的参数,避免越界访问内存。

三、整数溢出在C语言中,整数溢出是指当一个整数变量超出其类型所能表示的范围时,会导致其值变为负数或者溢出为较小的正数。

攻击者可以通过构造恶意输入,使得整数溢出,从而突破程序中的验证逻辑,导致安全漏洞。

防范措施:- 使用足够长的整数类型来存储数据,避免溢出。

- 对输入进行有效验证,限制输入值的范围。

四、空指针解引用空指针解引用是指当程序中的指针变量为空时,却试图通过该指针访问所指向的内存区域。

攻击者可以通过构造恶意输入,使得程序解引用空指针,导致程序崩溃或者执行恶意代码。

防范措施:- 在使用指针之前,应对指针进行有效的验证,确保指针不为空。

windows平台下的格式化字符串漏洞利用技术

windows平台下的格式化字符串漏洞利用技术

windows平台下的格式化字符串漏洞利用技术作者:Abysssec译者:riusksk(泉哥:)本文真正的受益者应该是那些有定汇编语言基础,以及具备经典的栈溢出知识的人,这样本文才能引领读者在windows平台下编写出自己的格式化字符串漏洞利用程序。

本文主要讲述各种关键的利用技术,也许在本文发布前已经有不少人写了关于格式化字符串漏洞的文章,但他们的文章一般都相对枯燥和基础。

但我们也不敢说本文讲述得相当出色和全面,不过我们会尽量使其达到这种程度。

格式化字符串这类软件漏洞最初是在1999年左右发现的,但在2000年之前一直被认为是没有危害和利用价值的。

格式化字符串攻击可使程序崩溃或者执行恶意代码。

这个问题源于对用户输入内容未进行过滤导致的,这些输入数据都是作为某些C函数执行格式化操作时的参数,如printf()。

恶意用户可以使用%s和%x等格式符,从堆栈或其它可能内存位置来输出数据。

也可以使用格式符%n向任意地址写入任意数据,配合printf()函数和其它类似功能的函数就可以向存储在栈上的地址写入被格式化的字节数。

一个经典的exploit是混合这些技术,然后用恶意shellcode的地址来覆盖某一链接库函数地址或者栈上的返回地址。

其中填充的一些格式化参数主要是用于控制输出的字节数,而%x主要用于从栈中弹出字节直至格式化字符串自身的起始位置。

伪造的格式化字符串起始部分应该用欲执行的恶意代码地址来覆写,这个可以借助%n格式符来实现。

因此你现在需要理解受此类漏洞影响的PERL 和C/C++软件,除printf()函数之外,其它函数也可能受到格式化字符串漏洞的影响,比如:●Printf()●Snprintf()●Vprintf()●Syslog()●……格式化字符串漏洞除了可以执行恶意代码外,还可以从漏洞程序中读取某些数据,比如密码及其它重要信息。

下面我们写份C代码进行分析,以帮助大家理解消化。

#include <stdio.h>#include <string.h>int main (int argc, char *argv[]){int x,y,z;x= 10;y= 20;z = y -x;print (“the result is : %d”,z); // %d using correct format so code is secure}#include <stdio.h>#include <string.h>void parser(char *string){char buff[256];memset(buff,0,sizeof(buff));strncpy(buff,string,sizeof(buff)-1);printf(buff); //here is format string vulnerability}int main (int argc, char *argv[]){parser(argv[1]);return 0;}正如你在parser函数中看到的,程序员忘记使用%s来输出buf,以致攻击者可以使用它控制程序的执行流程,进而执行恶意shellcode。

C语言技术中常见的安全漏洞及预防措施

C语言技术中常见的安全漏洞及预防措施

C语言技术中常见的安全漏洞及预防措施近年来,计算机应用逐渐深入到我们的生活中的各个领域,而软件作为计算机系统中最重要的组成部分之一,其安全性一直备受关注。

在软件开发过程中,C语言常作为首选语言,但由于C语言的灵活性和强大的底层控制能力,导致C语言程序容易受到各种安全漏洞的侵害。

本文将详细介绍C语言技术中常见的安全漏洞以及相应的预防措施。

一、缓冲区溢出缓冲区溢出是C语言中最常见的安全漏洞之一。

它通常出现在程序中使用了不安全的字符串处理函数,如strcpy、strcat等。

当输入的数据超过了目标缓冲区的大小时,溢出数据会覆盖其他内存区域,从而导致程序崩溃或者执行恶意代码。

预防措施:1. 使用安全的字符串处理函数,如strncpy、strncat等,可以指定拷贝或追加的最大长度。

2. 对输入数据进行合法性检查,确保输入长度不超过目标缓冲区的大小。

3. 使用堆栈保护技术,如栈溢出保护(StackGuard)、堆溢出保护(HeapGuard)等。

二、格式化字符串漏洞格式化字符串漏洞也是C语言中常见的安全漏洞之一。

当程序使用了不安全的格式化输出函数,如printf、sprintf等,且使用者可控的输入作为格式化字符串的参数时,就有可能导致格式化字符串漏洞。

预防措施:1. 使用安全的格式化输出函数,如snprintf、sprintf_s等,可以指定输出字符串的最大长度。

2. 避免使用用户可控的输入作为格式化字符串的参数,或者对输入进行严格的合法性检查。

三、整数溢出漏洞整数溢出漏洞常出现在处理算术运算、数组索引等情况下,当一个数值超出了该类型的表示范围时,溢出的部分将被截断,导致运算结果不正确,甚至引发程序崩溃或漏洞利用。

预防措施:1. 在进行数值计算时,进行溢出检查,避免直接使用可能溢出的运算结果。

2. 对于需要存储大数值的情况,采用更加安全的数据类型,如stdint.h头文件中的int64_t等。

四、空指针引用漏洞当程序中对一个空指针进行解引用,即访问空指针所指向的内存区域时,将导致程序崩溃。

C语言中的常见安全漏洞与防范措施

C语言中的常见安全漏洞与防范措施

C语言中的常见安全漏洞与防范措施C语言是一种广泛应用于系统开发和编程的高级编程语言。

然而,由于其较低级别的设计和功能,C语言在安全性方面存在一些挑战。

在本文中,我们将探讨C语言中的常见安全漏洞,并介绍一些常见的防范措施。

1. 缓冲区溢出缓冲区溢出是C语言中最常见的安全漏洞之一。

它发生在程序尝试向一个已经存满数据的缓冲区写入数据时。

这可能导致覆盖其他内存区域,损坏堆栈或执行恶意代码。

为了防范缓冲区溢出,开发人员可以采取以下措施:- 使用安全的字符串处理函数,如strncpy()而不是strcpy(),并确保输入数据不会超过缓冲区大小。

- 对用户输入进行验证和过滤,避免接受超出预期长度的输入。

- 使用编译器提供的栈保护机制,如堆栈保护器(stack protector)。

2. 格式化字符串漏洞格式化字符串漏洞是由于使用不安全的格式化字符串函数(如printf()、sprintf())而导致的。

攻击者可以利用这些函数的漏洞来读取和写入内存中的数据,从而发起各种类型的攻击。

要防范格式化字符串漏洞,可以采取以下措施:- 避免在printf()等函数中使用动态格式字符串。

- 使用安全的格式化字符串函数,如snprintf()。

- 对用户输入进行严格的验证和过滤,确保它们不包含格式化字符串。

3. 整数溢出整数溢出是由于计算结果超出了变量所能表示的范围而导致的。

攻击者可以利用这种漏洞来改变程序的控制流或者执行未授权的操作。

为了防范整数溢出,可以考虑以下措施:- 在进行数学运算之前,检查输入数据是否在有效范围内。

- 使用更大范围的整数类型来存储运算结果。

- 在可能发生溢出的情况下,对程序进行边界检查和错误处理。

4. 内存泄漏内存泄漏是指程序在分配内存后未正确释放而导致内存消耗过多。

这种漏洞可能会极大地影响程序性能并导致资源耗尽。

为了防范内存泄漏,可以采取以下措施:- 在分配内存后,确保及时释放不再使用的内存块。

- 使用内存分配和释放的最佳实践,如使用malloc()和free()函数的配对调用。

Windows格式化字符串漏洞利用

Windows格式化字符串漏洞利用

Windows格式化字符串漏洞利用作者:mr_me https:///blog/译者:StudyRush(老钟古)/StudyRush/老钟古序:本来是打算翻译作者的另外一篇文章(/blog/?p=71)的,但是由于在实战分析过程中遇到了一些问题自己暂时无法解决,等技术掌握更深入一些之后再去想办法解决之后再进行翻译(实在不想让它胎死腹中)。

因为没有实战分析过的文章对自己产生的价值会小很多,没有实践过就等于把文章最精华的部分给浪费了,不能够为了翻译而翻译。

在翻译的过程中加了很多自己的心得体会。

正文:这经常让我感到很奇怪怎么样才能够从一个格式化字符串的bug中来执行代码。

我知道在这样的一种情况下我们能够用C类型的说明符进行漏洞利用,在一个X86平台上我们不能够直接指向EIP寄存器或者结构化异常处理。

当大部分格式化字符串bugs几乎不存在时,我仍然感到对于任何一个安全分析师来说这是一个值得去理解的概念。

(即什么是格式化溢出漏洞)基本步骤:1.通过说明符%x来找到我们的缓冲区攻击字符串的起始位置。

2.使用%n将这个值写入到EAX寄存器中。

3.将一个指向我们的shellcode的地址放入到ECX/EDX寄存器中(为什么呢?)4.通过%x来重新计算EAX寄存器的偏移并用一个有效的返回值来覆写它(译注:补充点小知识:在格式化字符串的输出中(1)s—这个参数被视为指向字符串的指针,将以字符串的形式输出参数;(2)n—这个参数被视为指向整数的指针,在这个参数之前输出的字符的数量将被保存到这个参数指向的地址里。

这个可以自己动手实践一下)举个例子来验证一下%n的实际输出结果。

命令1:E:\编程练习\C专家编程\第一章>formatstring.exe AAAAAAAAAA%x%x%x%x%x%x%x在没有使用%n说明符的输出结果看下图AAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD00000000003e3b2f 这个里一个32个字符用上面的输入则可以看出输出的字符数是为32的,现在我们再次输入上面的命令并把一个%x用%n进行替换,命令2:E:\编程练习\C专家编程\第一章>formatstring.exe AAAAAAAAAA%x%x%x%x%x%x%n这时候的结果就为,参看下图:从上面的得到的结果我们就可以知道,%n格式符把它的参数作为内存地址,把前面输出的字符的数量写到那个地址去,这一操作结果也就意味着我们有机会改写某个内存地址的数据,从而控制程序的执行,是不是感到有点迷糊呢?继续看接下来的分析)。

软件安全中的漏洞挖掘和漏洞修复技术研究和应用

软件安全中的漏洞挖掘和漏洞修复技术研究和应用

软件安全中的漏洞挖掘和漏洞修复技术研究和应用不同于传统的软件开发活动,软件安全中的漏洞挖掘和漏洞修复技术的研究和应用具有重要的意义。

随着软件攻击和黑客入侵事件的不断增加,保障软件安全已经成为组织和个人共同面临的重大挑战。

本文将就软件安全中的漏洞挖掘和漏洞修复技术进行探讨和分析。

漏洞挖掘是指通过对软件进行静态分析、动态调试和模糊测试等手段,发现软件中存在的漏洞和安全隐患。

漏洞通常是由于软件代码的缺陷或者不当的设计而引起的,攻击者可以利用这些漏洞来获取系统权限、窃取用户数据或者干扰软件正常运行。

因此,漏洞挖掘的目的是找出软件中的弱点,及时修复,提高软件的安全性。

在漏洞挖掘的过程中,研究人员需要掌握多种技术和工具。

静态分析是一种重要的漏洞挖掘方法,通过对软件源代码或者二进制代码进行分析,找出其中存在的漏洞和潜在的安全问题。

动态调试则是通过对软件运行过程中的变量、函数调用堆栈等信息进行监控和分析,找出其中的异常行为和不当输入。

模糊测试则是一种通过输入大量随机和非法的数据来测试软件的安全性,找出其中的漏洞和错误。

另外,漏洞挖掘还需要对软件相关的协议和规范进行研究,以便更好地理解软件的内在机制和可能存在的安全隐患。

在发现漏洞之后,需进行漏洞修复。

漏洞修复技术是指通过修改软件代码或者应用程序配置等手段,消除漏洞和提高软件的安全性。

漏洞修复需要根据具体的漏洞类型和软件环境来进行。

一般而言,漏洞修复的目标是消除漏洞引起的安全隐患,并确保软件的正常运行。

修复漏洞的方法包括修补软件代码、增加身份验证机制、加强访问控制和引入加密技术等。

此外,漏洞修复还需要考虑软件的兼容性和性能等方面的影响,以确保修复过程不会产生新的问题。

除了漏洞修复技术,维护软件的安全还需要及时更新和升级软件。

随着漏洞被攻击者发现和利用的时间窗口越来越短,及时更新软件成为至关重要的一环。

软件开发者应该建立安全更新机制,定期发布安全补丁,用户也需要积极升级软件,以便及时修复漏洞。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

格式化字符串漏洞研究杜旭涛1,2,∗邢春晓2,†周立柱1,‡1清华大学计算机系,北京1000872清华大学WEB与软件技术中心,北京100087摘要格式化字符串漏洞对计算机系统和网络具有很大的危胁。

攻击者利用格式化字符串漏洞可以远程侵入网络上的计算机系统,偷看系统信息甚至得到系统的完全控制权。

由于与传统的缓冲区溢出漏洞攻击的原理不同,对于缓冲区溢出漏洞进行防范的方法对于格式化字符串漏洞通常会失效。

对于高可信软件来说,如何避免和防范格式化字符串漏洞的危害就显得格外重要。

本文对格式化字符串漏洞进行了综合的介绍。

指出了格式化字符串漏洞的成因和危害。

使用多个例子从预防的角度说明了利用该漏洞进行攻击的基本原理。

然后对相关的漏洞防范工具作了介绍。

关键词格式化字符串漏洞;shellcode;攻击;漏洞防范工具Survey of Format String VulnerabilityXu-Tao Du1,2Chun-Xiao Xing21Department of Computer Science,Tsinghua University,Beijing1000802Research Center of WEB and Software Engineeing,Tsinghua University,Beijing100080Abstract Format string vulnerability is a vital threat to computer systems and networks.By exploiting the format string vulnerability,attackers can break into computer systems in the internet.They can get various information about the computer systems and can even get full control of them.Since the principle and methods of exploiting format string vulnerability and that of exploiting traditional buffer overflow vulnerability are different,tools for preventing buffer overflow attacks will usually fail in front of format string attacks.For the High-Confidential Software,its very important to avoid and prevent from the damage of format string vulnerability.This paper introduce the format string vulnerability.After point out its origin and potential damage,we show the method to exploit this vulnerability through several concrete examples.Then we introduced some protecting tools for this vulnerability.Keywords Format String Vulnerability;Shellcode;Attack;Protecting Tools∗通讯作者。

电子邮件:dxt05@†电子邮件:xingcx@‡电子邮件:dcszlz@1格式化字符串漏洞(Format String Vulnerability)1999年,Tymm Twillman发现了第一个格式化字符串漏洞[1]。

2000年,tf8在BugTraq上发布的wu-ftpd中的格式化字符串漏洞[2]使得该漏洞广为人知。

之后,众多的格式化字符串漏洞被发现。

虽然已经过去好几年,但是新的格式化字符串漏洞仍不断被发现(见BugTraq)。

美国国家漏洞数据库(NVD)上2007年8,9,10三个月报告的格式化字符串漏洞有29个(如:Oracle OPMN daemon([3]),TIBCO SmartPGM FX([4]))。

这些漏洞大都使攻击者可以远程攻击系统,运行任意代码,从而控制系统。

格式化函数是一系列ANSI C函数(如printf函数),它们可以接受可变数量的参数,其中一个称为格式化字符串参数(format string)。

格式化函数对输入的格式化字符串参数进行解释,根据该参数的要求使用其它的输入参数,形成输出的字符串。

格式化字符串函数几乎被用在所有的C程序中,用来输出、打印错误信息或处理字符串。

正因为这些函数使用的广泛性,它们的漏洞对系统安全有重要的影响。

攻击者利用格式化字符串漏洞可以获得系统的控制权,这一点对于高可信软件和服务器软件来说是致命的。

本文在第2节对格式化字符串函数作一般性的介绍;第3节,我们利用格式化字符串漏洞的基本方法;第4节,我们对格式化字符串漏洞相关的防范工具作出介绍;第5节是结论。

2格式化字符串函数2.1格式化字符串函数家族C99标准定义的格式化字符串函数包括:•int fprintf(FILE*stream,const char*format,...)根据format提供的控制信息将输出内容输出到stream;•int printf(const char*format,...)根据format提供的控制信息将输出内容输出到stdout;•int sprintf(char*str,const char*format,...)根据format提供的控制信息将输出内容输出到s,以 \0 结尾;•int snprintf(char*str,size_t size,const char*format,...)将不大于size个字节的内容输出到str(包括结尾的 \0 );•vfprintf(FILE*stream,const char*format,va_list arg)•vprintf(const char*format,va_list arg)•vsprintf(char*str,const char*format,va_list arg)•vsnprintf(char*str,size_t size,const char*format,va_list arg)以上4个函数用固定长度的arg参数取代了原来的变长参数表,其它功能分别与fprintf, printf,sprintf,snprintf相同。

格式化字符串函数的主要功能为:1.将某些C类型的数据转换为字符串类型进行打印;2.根据参数format提供的控制信息,将其后的参数转换为某种输出格式;3.输出到不同的目标。

2.2格式化字符串函数与栈的关系格式化字符串函数的功能由作为输入参数之一的格式化字符串(即参数format)控制。

函数的所有参数都存放在栈上。

图1给出了一个简单的例子,可以说明栈在调用格式化字符串函数时的情况。

/*f s−exmp1.c*/−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−v o i d f u n c t i o n(i n t c){p r i n t f("Number o f p a r a m e t e r s on s t a c k:%d\n",c);}v o i d main(){f u n c t i o n(2);}图1:fs-exmp1.c图2是fs-exmp1.c的反汇编代码,通过该代码,我们可以清楚地看到function函数调用printf时所做的工作。

图2:fs-exmp1.c的反汇编代码首先,<function+0>和<function+1>是函数的序言。

<function+3>在栈上分配空间。

function函数本身并没有定义局部变量,所分配的空间是给向printf函数传递参数准备的。

<function+6>将main函数向function函数传递的参数2存入eax寄存器。

<function+9>将eax存入栈。

<function+13>将一个立即数0x80a056c存入栈。

图片的最后一行中,我们通过gdb的x命令显示了该立即数地址的内容。

该立即数就是格式化字符串“Number of parameters on stack:%d\n”的首地址。

这时需要向printf传递的参数已经全部存入栈中,于是<function+20>调用printf函数。

printf函数开始执行后,根据栈上的格式化字符串参数(在本例中就是“Number of parameters on stack:%d\n”)对栈上的其它参数进行对应的操作(通常是变换和组合),形成输出字符串,打印到stdout。

很显然,本例中printf从栈上取得整型参数2,将其转换为字符格式,然后与前面的字符一起输出到屏幕:Number of parameters on stack:2这里存在一个重要的问题,那就是,栈和其它内存区域一样,只是存储某些内容,而没有一个标签说明某个地址的内容是否printf的参数。

printf只是根据格式化字符串参数的控制要求从栈上取得其它参数。

如果格式化字符串参数被故意或不故意的写错了,那么printf函数就可能被利用来对系统进行攻击。

3利用格式化字符串漏洞的方法本节将使用具体例子介绍利用格式化字符串漏洞的基本方法。

这些例子并不是实际的系统攻击程序,而是为了说明格式化字符串漏洞而编写的说明性程序。

3.1偷看栈的内容图3给出了一个利用printf来偷看栈内容的程序。

在function函数中,调用printf时,格式化字符串参数要求后面有3个参数,分别以10进制(%d)和16进制(%x)来打印。

也就是说,该printf调用要求有4个参数,分别是格式化字符串参数和其后的3个需要打印的参数。

但是,给printf调用却只提供了2个参数。

printf根据格式化字符串参数的控制要求,从栈上读取3个字分别按10进制和16进制进行打印。

该程序的输出见图4:可以看到,将参数2正确打印出来后,printf又从栈上参数2之后的地址取得2个字的内容并以16进制打印出来。

以这种方式,通过对格式化字符串参数的控制就可以将栈上任意地址的内容打印出来。

相关文档
最新文档