格式化字符串攻击

2019-09-01 19:52

《信息系统应用安全》论文

选题:格式化漏洞原理及攻击 专业: 班级: 学号: 姓名: 指导老师:

时间:2012年4月28日

1

目录

一、选题背景................................................................................................................ 3 二、实验原理................................................................................................................ 3

2.1什么是格式化字符串攻击 .............................................................................. 3 2.2经典的格式化字符串漏洞 .............................................................................. 3 2.3 C99标准定义的格式化字符串函数 ............................................................... 3 2.4系统栈的工作原理 .......................................................................................... 4 2.5攻击原理 .......................................................................................................... 5 三、实验设计................................................................................................................ 5

3.1实验目的 .......................................................................................................... 5 3.2实验设计思路 .................................................................................................. 5 3.3实验环境 .......................................................................................................... 6 3.4实验所用到的工具 .......................................................................................... 6

3.4.1 microsoft visual c++ 6.0 .......................................................................... 6 3.4.2 Immunity Debugger ................................................................................ 6

四、实验验证................................................................................................................ 7

4.1系统栈的具体工作 .......................................................................................... 7 4.2printf函数漏洞 ............................................................................................... 10

4.2.1用printf函数读取内存数据 ............................................................... 10 4.2.2用printf向指定内存写数据 ............................................................... 11 4.2.3用printf向指定内存写入指定数据 ................................................... 11 4.3攻击之一—利用漏洞植入shellcode ............................................................ 12

4.3.1编写shellcode ...................................................................................... 12 4.3.2编写程序 .............................................................................................. 13 4.3.3获得shellcode存放的内存地址 ......................................................... 14 4.3.4找到存放函数返回地址的内存地址 .................................................. 15 4.3.5将存放返回地址单元内容修改为shellcode地址 ............................. 15 4.3.6实验结果 .............................................................................................. 16 4.4攻击之二—使缓冲区溢出 ............................................................................ 16 五、结论或总结.......................................................................................................... 17

一、经验........................................................................................................ 17 二、教训........................................................................................................ 18

六、参考文献.............................................................................................................. 18

2

一、选题背景

格式化函数是一系列ANSI C 函数 (如printf 函数),它们可以接受可变数量的参数,其中一个称为格式化字符串参数 (format string )。格式化函数对输入的格式化字符串参数进行解释,根据该参数的要求使用其它的输入参数,形成输出的字符串。

格式化字符串函数几乎被用在所有的C程序中,用来输出、打印错误信息或处理字符串。正因为这些函数使用的广泛性,它们的漏洞对系统安全有重要的影响。攻击者利用格式化字符串漏洞可以获得系统的控制权,这一点对于高可信软件和服务器软件来说是致命的。(引用《格式化字符串漏洞研究》)

二、实验原理

2.1什么是格式化字符串攻击

格式化字符串漏洞同其他许多安全漏洞一样是由于程序员的懒惰造成的。

也许有个程序员正在编写代码,他的任务是:打印输出一个字符串或者把这个串拷贝到某缓冲区内。为了节约时间和提高效率,他可能将代码:printf(\str);省略为printf(str); printf的第一个参数无论如何都会输出的!实际上他传入的一个他想要逐字打印的字符串被printf函数解释为一个格式化字符串(format string)。函数在其中寻找特殊的格式字符比如\。如果碰到格式字符,一个变量的参数值就从堆栈中取出。

这样程序员在不知不觉中打开了一个安全漏洞,可以让攻击者控制程序的执行。很明显,攻击者至少可以通过打印出堆栈中的这些值来偷看程序的内存。但是有些事情就不那么明显了,这个简单的错误允许向运行中程序的内存里写入任意值,这样修改函数返回地址也就不是件困难的事了。

2.2经典的格式化字符串漏洞

表一—常见的格式化漏洞

2.3 C99标准定义的格式化字符串函数

①int fprintf(FILE *stream, const char *format, . . . )

根据format提供的控制信息将输出内容输出到stream;

3

②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相同。

这些函数的工作机制大体相同,我研究针对的是printf函数的漏洞分析和攻击。

2.4系统栈的工作原理

在windows平台下,高级语言写出的程序经过编译链接,最终会变成PE文件,当PE文件被装载运行后,就成了所谓的进程。

进程使用的内存可以按照功能分为下面4个部分:

1.代码段:存储着执行程序的二进制机器代码,计算机会到这个区域取指令并执行。

2.数据段:用于存储全局变量、静态变量等数据。

3.堆区:进程可以在通过 malloc 等函数动态地在堆区申请一定大小的内存,并在用完之后释放内存。 由程序员申请和释放,若程序结束而有些存储单元还未释放,则一般由操作系统释放。

4.堆栈区:用于动态地存储函数之间的调用关系,以保证被调用的函数在返回时恢复到母函数中继续执行。函数调用时的参数和局部变量都保存在堆栈中。由系统自动分配。

ESP:栈指针寄存器,总是指向系统栈的栈顶 EBP:基址寄存器,总是指向函数栈帧的栈底 EIP:指令寄存器,总是指向下一条等待的指令

机器上的堆栈被认为是反向的,即堆栈是由高端地址向下增长的。即当一个信息被压栈时,ESP 减少,新元素被写入目标地址,当一个信息被弹出时,则从ESP 指针所指向的地址中读出一个元素,ESP 增加,向上边界移动并压缩堆栈。

当调用函数时:

1)参数入栈,参数从右向左依次压入系统栈

2)返回地址入栈,母函数调用处下一条指令的地址

3)栈帧调整,包括EBP入栈,将ESP值装入EBP,更新栈底部,ESP减去所需空间大小,抬高栈顶。

当函数返回时: 1)保存返回值

4

2)弹出当前栈帧,恢复下一个栈帧,包括将ESP加上栈帧的大小,降低栈顶,回收当前栈,将当前栈底部保存的前栈帧EBP弹入EBP寄存器,将返回地址弹给EIP寄存器

3)跳转,回到母函数中继续执行。

2.5攻击原理

传统的缓冲区溢出攻击只能覆盖缓冲区相邻的内存地址。而格式化字符串漏洞攻击几乎可以改写任何内存地址。因此,除了修改函数的返回地址以外,利用格式化字符串漏洞还可以有其它的攻击目标和方法。例如: ? 改写GOT段[7] ; ? 改写.dtors段[8] ; ? 改写函数指针[9] ;

? 利用可变长度数组[10] ; 此次实验,我采用的基本方案是:

由于printf函数漏洞,可以查看和修改内存的值,我们利用该性能可以修改调用函数的返回值,如果修改为我们恶意代码的地址值,那在函数调用返回值,就不再跳转到母函数执行,而是执行我们的恶意代码,这样我们就控制了程序。

三、实验设计

3.1实验目的

1、了解系统栈的工作流程,特别注意返回地址的存放细节。

2、使用具体例子介绍利用格式化字符串漏洞的基本方法。这些例子并不是实际的系统攻击程序,而是为了说明格式化字符串漏洞而编写的说明性程序。

2、利用格式化字符串漏洞尝试植入shellcode。

3.2实验设计思路

由系统栈的工作原理可以发现存在一个重要的问题,即栈和其它内存区域一样,只是存储某些内容,而没有一个标签说明某个地址的内容是否printf 的参数。printf只是根据格式化字符串参数的控制要求从栈上取得其它参数。如果格式化字符串参数被故意或不故意的写错了,那么printf 函数就可能被利用来对系统进行攻击。

普通的缓冲区溢出就是利用了堆栈生长方向和数据存储方向相反的特点,用后存入的数据覆盖先前压栈的数据。而格式化字符串漏洞是因为printf的%d(%x、%f等)格式检测功能,使得内存被非法读取,而利用%n使得内存内容被非法写入,若黑客写入的内存单元恰好是函数的返回地址,即覆盖返回地址,那程序的流程将会改变,这样,子函数返回时就跳到了攻击者指定的地址,就可以按照攻击者的意愿做任何事情了。

于是可以确定这样的实验思路:

5


格式化字符串攻击.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:青海畜牧兽医职业技术学院自主招生面试试题综合素质答案技巧

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: