请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

梦织未来

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7857|回复: 16

二进制漏洞系列课程-(1)初识二进制漏洞

[复制链接]

升级   100%

19

主题

11

精华

69

积分
发表于 2016-12-13 16:26:09 | 显示全部楼层 |阅读模式
本帖最后由 冠7 于 2017-2-14 14:32 编辑

     二进制漏洞挖掘,是软件安全的一个分支,通常出现在文件格式,协议栈,api接口,系统应用组件等   
     漏洞往往是由程序员的不谨慎编码造成的,常会出现在内存分配,堆栈平衡,协议栈通讯,组件接口问题等等
     细分二进制分为栈溢出,堆溢出,内存破坏漏洞,uafdoublefree, 等等..其实都和内存相关的,
     所以这些知识也要求对C语言有简单了解.这是刚接触的第一节我会尽可能最详细的讲出来..
环境Win7 sp1 x64  dep关闭,SafeSeh关闭,Aslr关闭,
工具 Vs2013  ImmunityDebuger  mona.py
           FlexHex     http://www.flexhex.com/download/
1.png
文中例子是读取大于1024个字节的字符串撑爆局部变量空间覆盖了函数的返回地址从而导致eip可控(程序即将执行的指令)
通过jmp esp覆盖eip的那四个字节的数据来控制程序流程,我们先看这样一段代码:

                                                    void ShowFileInfo(char*szfileName)
                                                  {
                                                              HANDLE hFile ;                                        //创建文件句柄
                                                           DWORD dwSizeHigh,dwSizeLow ;                            //声明文件大小
                                                          BYTE buf[1024];                                       //定义一个1024字节的缓冲区
                                                         memset(buf,0xbf,1024);                                   //初始化这个缓冲区
                      hFile=CreateFile(szfileName,GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
                                                 //上面这个api是用于文件操作,创建文件实例句柄的一个api 具体用法去查msdn
                    dwSizeLow=GetFileSize(hFile,&dwSizeHigh);                      //获取文件大小              
                                                      printf("file:%s Size:%d \r\n",szfileName,dwSizeLow);               //打印出文件名字的大小
                                                      ReadFile(hFile,buf,dwSizeLow,&dwSizeHigh,NULL);      //把文件读取到我们定义的buf[1024]
                                            }
                                               int _tmain(int argc,_TCHAR*argv[])
                                           {
                                                         if (argc ==2)                                         //这里采用了命令行参数
                                                      {
                                                           ShowFileInfo(argv[1]);                   //main的第二参数就是我们的文件名指针
                                                     }
                                           system("pause");
                                             return 0;
                                       }
代码的功能是将工程目录下的一个文件读取到我们自己定义的一个1024字节的数组中.
我们现在已经定义好了一个1024个字节的字符数组,我们还需要构造一个文件,来覆盖掉函数的返回地址
我们使用mona.py 这个py脚本来随机生成定长的字符串,需要python2.7以上环境支持.这个脚本是放在我们这个ImmunityDebug里面的,
当然你也可以在Windbg中使用它,

2.png
打开ImDebug在下方命令行支持脚本运行.下方命令行输入!mona就出来了它的功能.关于ImDebug配置mona.py我就不说了网上去找

3.png

我们先随机生成一个1024个字节的文件,去pattern.txt把这段字符串Copy到我们的程序下1.txt里面
我们这里要设置几个选项,命令行参数设置成我们的要读取的文件
4.png
5.png
6.png
7.png

为了避免一些未知的错误。。这里选择关闭所有的安全检测和编译器的安全编码机制.

8.png


配置完开始调试程序,下个断点跑下.在反汇编窗口中跟随,我们看内存监视

9.png

我们要覆盖点这个001010AD这个位置 改成一个跳转

10.png

可以看到018FF2C以上都是我们的局部变量.这时候还未文件进行读取,可以看到我们的004010ad

11.png

也就是ShowFileInfo的返回地址距离我们局部变量16个字节,F10单步
可以看到成功读取到我们的局部变量buf.你可以看mona生成的最后四个字节是不是BiOB,但是距离我们的函数返回地址还有16个字节,也就是说还需要20个字节才能覆盖掉我们的函数返回地址
我们可以构造一个恶意文件了:1024byte+16byte+4byte(jmpesp)+shellcode  (其中的4btye即函数返回地址)
先不管shellcode我们用mona生成一个1024+20长度的文件  !mona pc 1044 来到ImDebug根目录查看
我们留意一下生成的最后四个字节6Bi7  将新生成的字符串Copy到程序的1.txt
12.png
004010AD是我们函数的返回地址. 单步一下看看能否覆盖掉 4010ad

13.png
14.png

Bingo!成功覆盖

15.png

我们到这里还没完,我们继续单步走,看看走到这里会发生什么?

16.png


这里注意三个地方一个是他的提示,在看反汇编窗口,? 这块内存指向了一个空区域
然后在看内存监视窗口,37694236 不正是我们构造文件的最后四个字节么,可以看到这四个字节已经成功覆盖掉函数的返回地址了,这四个字节我们就可以用来搞点事情了。我们现在需要在程序中找到一个稳定的跳板用来跳转到我们的shellcode,方法有很多,可以自己load一个,注入一个。如果是注入dll来做跳板,一定要用未开启aslrdll 这样其中指令都为硬编码,才可稳定跳转至我们的shellcode,我们使用ImDebug来调试

17.png

/***********一定不要忘了这个命令行参数,

18.png

我们编译方式是Realse版本的,入口点停在7xxxxxx点击运行一下,然后来到我们的用户代码

Realse程序的反编译是先是一个安全cookie检查,接着一个跳转,Debug则相反 是先jmp call

19.png

他和OD用法差不多,买的OD的源码,调试方法一样,来到程序入口点 00401090
ImDebug中如果单步到这个位置004010AD他程序会跑飞的,而od会接管你这个异常

20.png


进入ShowFileInfo,查看堆栈窗口,函数的返回地址正是4010ad,我们跟随这个地址单步当前的eipReadFile  单步一步看4010ad的地址是否被覆盖, 成功覆盖

21.png

当前的eipReadFile  单步一步看4010ad的地址是否被覆盖, 成功覆盖
22.png
接下来就是寻找跳板,可以用mona插件,命令:!mona jmp –r esp 他会从不安全的函数中查找,因为实验我们自己写一个写到我们ShowFileInfo中。
                           if (hFile ==INVALID_HANDLE_VALUE)
                             {
                           Return;
                                 __asm{ jmp esp}
                           }
         我们用mona查找一下jmp esp

23.png

这里点下工具栏中的L,然后就看到了一个pointer 00401089处的jmp esp(咱们自己写的地址)

24.png

这时我们修改之前的1.txt文件,用二进制编辑软件打开我用的是FlexHex,,随便一个都可以

25.png

修改二进制数值36 42 69 37 89 10 40 00
我们重新载入运行到ShowFileInforet指令处 F8单步.可以看到到了jmp esp这里

26.png

单步一步,此时我们的ESP指向了 函数压入的第一个参数,这时候我们就需要一个shellcode来覆盖掉esp  shellcode 起始位置是 0018FF44

27.png

我们在jmp esp中添加四个字节看下函数的参数是否被覆盖
1.jmpesp   2.我们测试的四个字节

89.png

CallReadFile这里单步一步.可以看到原本函数的参数 1.txt 已经被覆盖成了2345

263.png
eip指向我们覆盖的返回地址时候,我们继续单步走
30.png

可以看到我们的2345 在反汇编窗口中翻译成了机器码32 33 34 35,我们让它弹出一个MessageBox,MessageBox有四个参数。没loaduser32.dll自己写一个
简单点 然后我们把这段指令的二进制抠出来:

31.png

32.png

这样就弹出了我们的MessageBox.

33.png

通过这样一个简单的例子现在我们总结出了一个过程,从漏洞发现到利用
第一步:寻找不安全的函数,例子中的ReadFile,使用超长字符串覆盖函数的返回地址
第二步:寻找跳板,可以用dll也可以用mona获取,来覆盖函数的返回地址,不局限于我们jmp esp后面还会用到其他的方式
第三步:构造shellcode,要考虑缓冲区的大小能否存放的下,后面也会提到其他方法来jmp到我们的shellcode



  本系列教程整理自视频:  链接: http://pan.baidu.com/s/1gfbWNbt 密码: zhmk
欢迎加入Disasm交流群:  104132152





29.png
回复

使用道具 举报

升级   13%

18

主题

0

精华

239

积分
发表于 2016-12-13 17:24:52 | 显示全部楼层
真的强 占个前排 以后来看~
回复 支持 反对

使用道具 举报

升级   100%

217

主题

64

精华

1463

积分
发表于 2016-12-13 18:48:17 | 显示全部楼层
很棒!
ImmunityDebug分析漏洞不错~

现在的dep safeseh cookie等等都让传统的利用方式失效了 = =

现在玩的开的基本也是uaf了--
我一定是见鬼了!
回复 支持 反对

使用道具 举报

升级   100%

19

主题

11

精华

69

积分
 楼主| 发表于 2016-12-13 18:53:54 | 显示全部楼层
mengwuji 发表于 2016-12-13 18:48
很棒!
ImmunityDebug分析漏洞不错~

嗯,uaf, double free 后续都会讲讲.. 但实战中溢出这类的不好利用了
回复 支持 反对

使用道具 举报

升级   100%

217

主题

64

精华

1463

积分
发表于 2016-12-13 18:57:59 | 显示全部楼层
冠7 发表于 2016-12-13 18:53
嗯,uaf, double free 后续都会讲讲.. 但实战中溢出这类的不好利用了

是吖 ,很不好检测也很不好利用,但是内核漏洞这种占大多数。

对了还有个是引用计数器溢出漏洞,这个也挺好玩儿的
我一定是见鬼了!
回复 支持 反对

使用道具 举报

升级   26%

3

主题

1

精华

13

积分
发表于 2016-12-13 19:13:01 | 显示全部楼层
可以,很强
回复 支持 反对

使用道具 举报

升级   100%

19

主题

11

精华

69

积分
 楼主| 发表于 2016-12-13 19:13:31 | 显示全部楼层
mengwuji 发表于 2016-12-13 18:57
是吖 ,很不好检测也很不好利用,但是内核漏洞这种占大多数。

对了还有个是引用计数器溢出漏洞,这个 ...

调内核漏洞 还有很多知识要学啊..
回复 支持 反对

使用道具 举报

升级   11.33%

39

主题

6

精华

67

积分
发表于 2016-12-13 20:07:34 | 显示全部楼层
加油
支持一下。哈哈哈
回复 支持 反对

使用道具 举报

升级   58%

1

主题

0

精华

29

积分
发表于 2016-12-13 21:43:08 | 显示全部楼层
这个牛B,感谢楼主分享,以后多放一点出来啊
回复 支持 反对

使用道具 举报

升级   9.67%

5

主题

1

精华

229

积分
发表于 2016-12-13 23:32:45 | 显示全部楼层
这个必须支持,楼主是不是从51PB出来的呀?
哎...今天够累的,签到来了...
回复 支持 反对

使用道具 举报

升级   100%

19

主题

11

精华

69

积分
 楼主| 发表于 2016-12-13 23:49:13 | 显示全部楼层
zquchs 发表于 2016-12-13 23:32
这个必须支持,楼主是不是从51PB出来的呀?

不是51pb哦.. 是15pb
回复 支持 反对

使用道具 举报

升级   82%

14

主题

0

精华

41

积分
发表于 2016-12-15 15:09:03 | 显示全部楼层
回帖..收走
回复 支持 反对

使用道具 举报

升级   100%

19

主题

11

精华

69

积分
 楼主| 发表于 2016-12-15 15:56:25 | 显示全部楼层
BlackTrace 发表于 2016-12-14 22:39
感觉,这个和某视频,一模一样

就是我的教程
回复 支持 反对

使用道具 举报

升级   0.67%

10

主题

1

精华

202

积分
发表于 2016-12-22 19:28:54 | 显示全部楼层

你不是群主吧
回复 支持 反对

使用道具 举报

升级   100%

19

主题

11

精华

69

积分
 楼主| 发表于 2016-12-22 20:35:05 | 显示全部楼层

那不重要,学到了知识就好
回复 支持 反对

使用道具 举报

升级   52%

0

主题

0

精华

26

积分
发表于 2017-1-23 23:07:48 | 显示全部楼层
系列教程很好  多谢~
回复 支持 反对

使用道具 举报

升级   28%

7

主题

0

精华

14

积分
发表于 2017-9-11 14:07:11 | 显示全部楼层
多谢,给大佬踩踩楼
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|mengwuji ( 粤ICP备13060035号-1 )  

GMT+8, 2017-9-21 22:09 , Processed in 0.336950 second(s), 29 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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