Exploit编写系列教程1-学习笔记

对于《Exploit编写系列教程1——基于栈的溢出》的学习笔记。

1.调研

从漏洞报告中获取漏洞相关信息,包括漏洞类型漏洞位置、漏洞危害及利用等。多数情况下,这些信息会给我们后续的分析提供灵感和入手点。本例中能获取到的基本信息如下——

通过创建一个恶意的.m3u 文件将触发 Easy RM to MP3 Converter version 2.7.3.700 缓冲区溢出利用。

2.验证bug

一、首先,根据关键信息.m3u 文件缓冲区溢出,我们编程构造一个包含较多内容的.m3u 文件,用目标程序打开,测试是否会发生崩溃。构建.m3u文件的python脚本如下——

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'创建一个文本文件'
import os
#输入文件名
while True :
    filename = raw_input('输入文件名')
    if os.path.exists(filename) :
        print 'ERROR: %s already exists' % filename
    else :
        break

#写入文件
fobj = open(filename, 'w')
fobj.write('A'*10000)        //如果没有触发程序崩溃,可以将10000改为更大的数字,直到触发崩溃
fobj.close()
print 'Done!'

依次改变’A’的个数,当从20000改变为30000时,应用程序发生崩溃。

当能成功触发应用程序的崩溃后,下一步就需要利用调试器(这里使用WinDbg)查看程序的崩溃现场(栈中数据和各寄存器的值),从而定位代码中的漏洞点。


基础知识补充——用户进程空间映像如下图。

对其中各个区块的说明如下——

  • .text 区块是只读的,包含了程序的执行代码,防止被修改;
  • .data 和.bss 区块被用来保存全局和静态的变量,这两个区块都是可写的和有固定的大小;
  • .data 区块用于已经初始化的全局变量,字符串,和其他的内容;
  • .bss 区块用于未初始化的变量;
  • 堆区块被用于其他的变量(动态申请的),它可以根据需要来改变大小。堆内存的分配工作由系统来管理;
  • 栈包括局部变量,函数调用和不需要长期保存的其他信息。每一个数据被压入,往低地址方向生长。

具体到本漏洞函数处的内存空间映像如下图。