预备知识
war-ftpd 1.65存在缓冲区溢出漏洞,当登录时用户名过长时就会发生缓冲区溢出,程序进而崩溃。本实验正是利用这一点使用调试工具cdb找出溢出时相应寄存器记录的地址,通过利用shellcode构造用户名字符串,使得war-ftpd程序接收此用户名时发生溢出进而执行shellcode,达到攻击目的。
实验目的
1)掌握缓冲区溢出原理;
2)掌握常用的缓冲区溢出方法;
3)理解缓冲区溢出的危害性;
4)掌握防范和避免缓冲区溢出攻击的方法。
实验环境
操作系统:Windows XP(sp3)
溢出对象:war-ftpd 1.65
调试工具:Ollydbg、Immunity Debugger、Windbg、CDB(四种调试工具任你选择)
编程语言:Python
软件地址:桌面
shellcode请在实验机内下载使用:http://tools.hetianlab.com/tools/shellcode.rar
实验步骤一
首先向war-ftpd发送1000字节的用户名,且字符串是不重复的,触发war-ftpd溢出漏洞,致使其崩溃。此时查看cdb调试器信息,EIP寄存器的信息即为溢出时RET中的地址,而此地址已被用户名字符串中的某4个字节覆盖。因此只需定位EIP的内容在1000字节字符串中的位置即可。
考虑将RET位置内容指向的指令为“JMP ESP”,而“JMP ESP”指令地址为(0x7ffa4512),因此将其替换到先前定位到的1000字节覆盖RET的位置,程序崩溃时就会执行JMP ESP指令了。接下来找到ESP内容在1000字节字符串中的位置,将其位置替换为shellcode,这样构造的登录用户名能达到溢出执行shellcode的攻击效果。
本实验选用的shellcode执行后的功能是在系统运行计算器。
1.在桌面war-ftpd文件夹启动war-ftpd程序,利用上述四种调试器之一(功能相同,看个人习惯,本次实验我采用了Immunity Debugger)将其挂起:
利用Immunity Debugger调试器将其挂起:
选中附加进程选项,找到var-ftpd这个进程,并将其挂起。
2.溢出时我们首先要确认junkcode()的大小,即在多大的字节小程序会产生溢出。
我们使用Immunity Debugger的mona插件来生成1000个字节:
!mona pattern_create 1000命令执行后会在这个目下C:\Program Files\Immunity Inc\Immunity Debugger生成pattern.txt,里面存放了1000 bytes的junkcode。
现在我利用python编写一个Socket程序将这些字节赋值给username段,发送给var-ftpd使之溢出。
#在这里我用python写了一个简单的程序,当然您也可以使用自己所熟悉的语言。#
#coding:utf-8
import socket
#生成的1000个字节
pattern = 'Aa0Aa1Aa