精华内容
下载资源
问答
  • 介绍二进制漏洞挖掘的一个方法思路,用IDA解析二进制代码,取得程序的函数,栈帧,数据流,控制流;取得程序的界面资源,取得资源对应的函数代码,综合分析程序的堆溢、栈溢、同步问题、线程安全问题、 逻辑漏洞分析...
  • 0x10 UAF(Use After Free) 漏洞原理 这里,需要先介绍一下堆分配内存的原则。ptmalloc 是 glibc 的堆管理器,前身是 dlmalloc,Linux 中进程分配内存的两种方式:brk 和 mmap。当程序使用 malloc 申请内存的时候,...

    0x10 UAF(Use After Free) 漏洞原理

    这里,需要先介绍一下堆分配内存的原则。ptmalloc 是 glibc 的堆管理器,前身是 dlmalloc,Linux 中进程分配内存的两种方式:brkmmap当程序使用 malloc 申请内存的时候,如果小于 128K,使用 brk 方式,将数据段(.data)的最高地址指针_edata往高地址推;如果大于 128K,使用 mmap 方式,堆和栈之间找一块空闲内存分配。同样的,当用户释放内存时,ptmalloc 也不会立马释放空间,当应用程序调用 free() 释放内存时,如果内存块小于256kb,dlmalloc将内存块标记为空闲状态。

    Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用,可能会导致意想不到的后果。分为以下三种情况1

    • 内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。
    • 内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。
    • 内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。

    学过 C 语言的人应该都知道,垂悬指针(dangling pointer)是指指向的内存被 free,但是没有置空,UAF 如果想利用的话,就是垂悬指针被再次使用。

    如下所示,展示了一种简单的情况,p1 被释放之后并没有置空,随后 p2 又申请了与 p1 曾申请的大小一样的内存,p2 指向的内存被修改之后,我们发现悬垂指针 p1 指向的内存也被修改了。情况一如下

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int * p1;
    	int * p2;
    	p1 = (int *)malloc(sizeof(int));
    	printf("p1 = %p, * p1 = %d\n", p1, *p1);
    	free(p1);
    
    	p2 = (int *)malloc(sizeof(int));
    	*p2 = 20;
    	printf("p2 = %p, * p2 = %d\n", p2, *p2);
    	printf("p1 = %p, * p1 = %d\n", p1, *p1);
    	free(p2);
    	return 0;
    }
    

    在这里12图片描述
    也就是说,p1 被释放后,不代表是野指针,而且仍然能够使用,如果置空后,又被使用了呢?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
      int * p1;
      int * p2;
      p1 = (int *)malloc(sizeof(int));
      printf("p1 = %p, * p1 = %d\n", p1, *p1);
      free(p1);
    
      * p1 = 20;
      printf("p1 = %p, * p1 = %d\n", p1, *p1);
    
      p1 = NULL;
      * p1 = 30;
      printf("p1 = %p, * p1 = %d\n", p1, *p1);
      return 0;
    }
    

    可以看到,free 后,p1 仍然可以被赋值,但是被置空后,就会崩溃
    在这里插入图片描述

    0x20 UAF 漏洞利用案例分析

    0x21 [Toddler’s Bottle]-uaf

    题目如下

    Mommy, what is Use After Free bug?
    
    ssh uaf@pwnable.kr -p2222 (pw:guest)
    

    将代码复制下来,发现是 c++,代码如下

    class Human{
    private:
    	virtual void give_shell(){
    		system("/bin/sh");
    	}
    protected:
    	int age;
    	string name;
    public:
    	virtual void introduce(){
    		cout << "My name is " << name << endl;
    		cout << "I am " << age << " years old" << endl;
    	}
    };
    
    class Man: public Human{
    public:
    	Man(string name, int age){
    		this->name = name;
    		this->age = age;
            }
            virtual void introduce(){
    		Human::introduce();
                    cout << "I am a nice guy!" << endl;
            }
    };
    
    class Woman: public Human{
    public:
            Woman(string name, int age){
                    this->name = name;
                    this->age = age;
            }
            virtual void introduce(){
                    Human::introduce();
                    cout << "I am a cute girl!" << endl;
            }
    };
    
    int main(int argc, char* argv[]){
    	Human* m = new Man("Jack", 25);
    	Human* w = new Woman("Jill", 21);
    
    	size_t len;
    	char* data;
    	unsigned int op;
    	while(1){
    		cout << "1. use\n2. after\n3. free\n";
    		cin >> op;
    
    		switch(op){
    			case 1:
    				m->introduce();
    				w->introduce();
    				break;
    			case 2:
    				len = atoi(argv[1]);
    				data = new char[len];
    				read(open(argv[2], O_RDONLY), data, len);
    				cout << "your data is allocated" << endl;
    				break;
    			case 3:
    				delete m;
    				delete w;
    				break;
    			default:
    				break;
    		}
    	}
    
    	return 0;	
    }
    

    0x22 关于 C++ 内存分布

    该代码有三个类,woman 和 man 继承自 human,每个类都有虚函数,子类重写了父类的虚函数,关于虚函数,请参考 从Java角度说起C++虚函数

    在C++中,每一个含有虚函数的类都会有一个虚函数表,简称虚表。与之对应的,每一个对象都会有其专属的虚表指针指向这个虚表

    虚表
    在这里插入图片描述

    这里,我们还需要知道对象的内存分布情况: 对象在内存开辟空间后,按照虚表指针、继承自基类的成员、类自身的成员的顺序进行存储。(如果是多重继承和虚继承,可能存在多个虚表指针)。当然,还需要了解 C++ 创建对象的调用栈

    --> std::allocator< char >::allocator(void)
    --> std::allocator< char >>::basic_string()
    --> operator new(ulong)
    --> Class Conductor
    --> std::allocator< char >>::~basic_string()
    --> std::allocator< char >::~allocator(void)
    

    如下图所示
    在这里插入图片描述
    我们有如下结论 2

    1. 每个类都有虚指针和虚表;
    2. 如果不是虚继承,那么子类将父类的虚指针继承下来,并指向自身的虚表(发生在对象构造时)。有多少个虚函数,虚表里面的项就会有多少。多重继承时,可能存在多个的基类虚表与虚指针;
    3. 如果是虚继承,那么子类会有两份虚指针,一份指向自己的虚表,另一份指向虚基表,多重继承时虚基表与虚基表指针有且只有一份。

    0x23 调试

    因此,我们的解题思路就是,对二进制文件进行逆向,找到虚表的地址,类似于 GOT 覆写技术浅析与实际应用,利用 UAF 漏洞,修改该虚函数表的地址即可。

    C++ 函数调用栈设置断点,观察情况。operator new() 函数的参数 0x18,表示为 man 对象创建 24B 的内存空间。
    在这里插入图片描述
    Man::Man(std::string,int) 函数初始化该内存
    在这里插入图片描述
    看一下m对象的内存空间具体分布。依次存放了虚表指针,即指向类 man 的虚函数指针;继承自父类的类成员变量 age、类成员变量 name,这里 name 是一个指针,存放的是 name 的地址。你们会发现,这里只存放了虚表的一个地址,并没有看到 introduce 的地址,这个后面再说。
    在这里插入图片描述
    由于二进制文件并没有开启地址随机化,所以,内存中的虚表指针的位置,就是 IDA 逆向得到的虚表位置,如下图所示
    在这里插入图片描述

    0x24 关于堆的 chunk 与 bin

    这里还需要知道堆的一些知识,更多详情请访问:https://wiki.x10sec.org/pwn/heap/heap_structure/

    在程序执行中,由 malloc 申请的内存,称为 chunk。这块内存在 ptmalloc 内部用 malloc_chunk 结构体来表示。当程序申请的 chunk 被 free 后,会被加入到相应的空闲管理列表中。

    用户释放掉的 chunk 不会马上归还给系统,ptmalloc 会统一管理 heap 和 mmap 映射区域中的空闲的 chunk。当用户再一次请求分配内存时,ptmalloc 分配器会试图在空闲的chunk中挑选一块合适的给用户。这样可以避免频繁的系统调用,降低内存分配的开销 3

    而 bin 就是这样一种数据结构,用来存放返回的 chunk。根据空闲的 chunk 的大小以及使用状态将 chunk 初步分为4类:fast bins,small bins,large bins,unsorted bin。详情我们不说,因为堆涉及的东西实在太多了,这里只介绍与本次 UAF 漏洞利用有关的知识。

    大多数程序经常会申请以及释放一些比较小的内存块。如果将一些较小的 chunk 释放之后发现存在与之相邻的空闲的 chunk 并将它们进行合并,那么当下一次再次申请相应大小的 chunk 时,就需要对 chunk 进行分割,这样就大大降低了堆的利用效率。因为我们把大部分时间花在了合并、分割以及中间检查的过程中。因此,ptmalloc 中专门设计了 fast bin

    因此,大部分时候我们调用的都是 fastbin 来存放被释放的 chunk,也就是说,为了更加高效地利用 fast bin,glibc 采用单向链表对其中的每个 bin 进行组织,并且每个 bin 采取 LIFO 策略,最近释放的 chunk 会更早地被分配,所以会更加适合于局部性。也就是说,当用户需要的 chunk 的大小小于 fastbin 的最大大小时, ptmalloc 会首先判断 fastbin 中相应的 bin 中是否有对应大小的空闲块,如果有的话,就会直接从这个 bin 中获取 chunk。

    对于本例来说,如果我们选择 3,按照代码来说,先释放 m,后释放 w,这时,它们都会被 ptmalloc 堆管理器放进 fastbin 中,如果我们再选择 2,分配小于 0x18 的内存空间,根据我们刚刚所说的,LIFO 策略,堆管理器直接利用 w 释放的 chunk。

    0x25 漏洞利用

    因此,我们先要释放程序在刚开始运行时,创建的对象 m 和 w,所以先选择 3;然后需要选择 2,进行覆盖,这里当然是要覆盖 w 内存空间中的虚函数 Woman::introduce(void) ,将其改为 Human::give_shell(void)
    在这里插入图片描述
    指针通过一个 +8 的操作调用 introduce 的时候。那么我们如果实现将指针减8,那么当调用introduce的时候加8,那么结果就是+0,即没有偏移,那就是giveshell的地址,刚好完成了我们的要求。ida中.rodata区段是存放虚表的地方。

    回到 0x22 所述,无论是 m 还是 w 对象,其内存空间中,最先放入的是虚表的地址(对象的内存并不会把虚表中的每个虚函数地址都存放),实际上,每个 m 和 w 都有两个虚函数,give_shell 在前,introduce 在后。内存访问 introduce 是通过整个虚表首地址 + 偏移地址 的形式,来找到正确虚函数的位置。而不是像 GOT 表那样,直接定位函数在 GOT 表中的地址。所以,这里要更改 w (或者 m)对象的内存第一位的数据,也就是虚表的基地址。而不是想当然的,认为将其改为多少,访问的就是哪个函数。

    0x401550 - 8 = 0x401548
    

    这里还有一点要注意的是,需要覆盖两次,即选择两次 2,如果只选择一次,直接选择 1,这时候,虽然 w 对象也被释放了,但是被覆盖了,依然还是能够输出的。然而 m 对象已经释放,打印会出错的。
    在这里插入图片描述

    0x30 总结

    UAF 漏洞主要是因为程序员对已经释放的内存操作不当,这类问题其实也是堆的问题,在一些较为复杂的代码中,数见不鲜,但其利用往往不是那么容易的,需要结合其他漏洞,达到组合的效果。本文中的例子,还需要我们掌握 C++ 的内存分配原理,还有一些虚函数的知识,才能够将问题迎刃而解。


    1. https://ctf-wiki.github.io/ctf-wiki/pwn/linux/glibc-heap/use_after_free-zh/ ↩︎

    2. https://www.cnblogs.com/jerry19880126/p/3616999.html ↩︎

    3. https://wiki.x10sec.org/pwn/heap/heap_structure/ ↩︎

    展开全文
  • 二进制漏洞挖掘技术实战

    万次阅读 2016-03-24 14:46:40
    0×00前言 ...关于二进制的漏洞研究,大体可以分为漏洞分析利用漏洞挖掘两部分。关于漏洞分析利用的部分互联网可以搜索到大量文章,而漏洞挖掘的文章却寥寥无几。因此我在这里主要来讲一下如何对

    0×00前言

    0X01漏洞挖掘方法

    0X02手动法漏洞挖掘

    0X03通用FUZZ法进行漏洞挖掘:

    0X04智能FUZZ法进行漏洞挖掘:

    0X05总结

    正文

    0X00 前言:

    关于二进制的漏洞研究,大体可以分为漏洞分析利用和漏洞挖掘两部分。关于漏洞分析利用的部分互联网可以搜索到大量文章,而漏洞挖掘的文章却寥寥无几。因此我在这里主要来讲一下如何对二进制软件进行漏洞挖掘。

    0X01  漏洞挖掘方法:

    漏洞挖掘,一种只追求结果不追求过程的工程。漏洞挖掘的方法很多,这里主要讲以下几种方法:
    1.手动法漏洞挖掘
    2.通用fuzz法漏洞挖掘
    3.智能fuzz法漏洞挖掘

    0X02手动法漏洞挖掘:

    • 什么是手动法挖掘:

    手动法挖掘,就是不使用自动挖掘工具,手动分析软件可能出问题的地方。其中挖掘点是靠手动来寻找的,畸形数据也是手动来构造的。用这种发现软件漏洞的方法,一般称为手动法。

    • 手动法漏洞挖掘的优点:

    手动测试不需要专业的fuzz工具,并且测试的漏洞主要是堆栈溢出漏洞,原理较为简单。因此手动挖掘的速度是非常快的,效率也是比较高的。可以在几十分钟内发现可利用的缓冲区溢出漏洞。

    • 手动法漏洞挖掘的缺点:

    相对于文件格式漏洞难以挖掘。因为文件格式的处理逻辑一般都较为复杂,关于这一点手动挖掘方法效果不是很好。

    • 如何进行手动挖掘:

    漏洞挖掘方法一般为:
    1.确定挖掘点
    挖掘点,就是用于挖掘的点。什么样的点可以作为挖掘点呢?凡是用户可控的数据点都可以作为挖掘点。包括程序路径,输入消息,文件内配置信息,等等。由于是手动挖掘,因此挖掘点不适合选择的过于复杂。很明显office系列,各种图片声音等等这样复杂的文件格式,是不适合定位于手动挖掘点的。
    2.对挖掘点填充畸形数据:找到挖掘点后,就可以对挖掘点填充各种畸形数据了。其中包括超长字符串,畸形字符,边界值数据等等。根据长期的挖掘经验来看,其中超长字符串的效果更好。并且超长字符串一般都为堆栈溢出,该漏洞一般情况下都是可以利用的。
    3.程序是否发生异常:程序崩溃,程序退出等。
    4.分析:如果发生异常,用反汇编工具和汇编级调试器深入分析(如WINDBG IDA OLLYDBG),找到异常原因,判断漏洞类型以及危害。

    • 手动挖掘方法举例:

    下面以两个例子来进行手动挖掘举例。
    1: sdemo2.0 缓冲区溢出漏洞
    漏洞编号:WooYun-2013-43556
    链接http://www.wooyun.org/bugs/wooyun-2010-043556
    软件介绍:S-Demo是一个大多被破解者用来作破解动画过程的软件,它可以记录你的屏幕上的任何动作及鼠标的移动过程,同时使用了较高的压缩率。当然压缩率可以选择,在正常的操作情况下,每分钟的生成的文件大小在200K左右。
    漏洞简介:该文件录制后的源程序文件格式属于自定义文件格式。程序在密码验证的时候,取加密后的密码(下面称密文)放入内存栈中,在执行strcpy函数时,没有对密文进行长度检测,导致堆栈溢出。如果用户用sdemo播放器打开黑客构造特定的smv文件,可以导致任意代码执行。
    挖掘思路:
    1.选择挖掘点:我们这里选择密文的处理区域。
    2.定位密文位置
    逆向分析法:通过逆向分析,查看函数处理密文的文件所在位置。
    对比法:如图(1),分别生成2个样本,密码不同。对比里面的信息,发现偏移为1A1H处数据不同,经过测试后发现这里就是密文信息。

    图片1
     图(1)

    3.构造畸形数据并测试据经验,超长字符串为手动fuzz的首选畸形数据,该密文字符串是以0结尾的,我们用winhex手动把这个字符串修改的很长,来测试程序是否发生崩溃。(1A0处其实是一个校验,如果为0表示该样本没有密码,也就不会解析后面的数据了,如果为1表示该样本是有密码的) 修改前的数据 图(2)

    图片2(图2)

    我们把数据修改的很长的时候,发现程序崩溃了。图(3)为修改后的数据。

    图片3

     (图3)

    4.分析崩溃信息:异常已经成功触发,下面我们用条实习详细分析一下异常的原理。如图(4),用OLLYDBG载入sdemo播放器S-Player.exe,然后打开我们构造的畸形文件。查看OLLYDBG的信息。这时候发现EIP的数值是43434343H,43H为C的ASCII码,也就是说EIP已经被我们所控制,一般情况下能控制EIP的漏洞都是可以利用的。

    图片4

      (图4)

    如图(5)通过分析。我们定位到漏洞是由strcpy函数所导致,在这个函数没有控制esi所指向数据的大小,esi指向的数据过大后可导致缓冲区溢出,直接淹没缓冲区地址。

    图片5

      (图5)

    如图(6)。调试,当路过strcpy函数后,观测SEH链表。淹没以后,我们发现SE处理程序是43434343H,这个数据就是我们输入的畸形数据,也就是说,我们可以控制SEH了。

    图片6

     (图6)

    5.漏洞利用:根据上面的分析原理,该漏洞是可以利用的。既然我们可以控制SEH, 那么我们可以通过pop pop ret来进行该漏洞的利用。首先我们要找控制SEH的地址。经过调试,我们发现密文偏移为4CH处的数据,就是SEH处理程序的地址。此时我们修改poc的数据如图(7)

    图片7

     (图7)

    我们验证下,将数据修改为:EEEEEEEEH,(48H修改为FFFFFFFFH,表示链表的尾部)此时被淹没的SEH链表。如图(8)

    图片8

     (图8)

    程序执行SH处理程序后,堆栈地址是

    FFFFFFFF 指向下一个SEH记录的指针,正是我们文件结构内的数据。该数据我们可以控制。下面我们的目标就是要运行到这个指令(数据FFFFFFFFH)。 因此我们只要在内存中选择pop pop ret类似的指令,就可以把堆栈前2个地址pop掉,然后返回这个指令所在的地址(数据FFFFFFFFH所在的地址)执行这里的指令了。我的系统是windows SP XP3,在我的系统中,我找到了这样一段代码。他的地址7FFA1571H,代码如图(9):

    图片9

     (图9)

    也就是说,我们让SEH地址为7FFA1571H,程序异常后,执行了这一段代码,然后eip返回到指令FFFFFFFFH。我们再把FFFFFFFFH这个数据修改成我们要执行的代码,就可以利用了。这时候我们把FFFFFFFFH修改为90909090H.测试下 如图(10)

    图片10

     (图10)

    这时候我们发现eip已经成功执行到这里。即为可以利用了。只要把我们的shellcode放在这里就可以了。

    6.EXP开发:这里我们开发了一个小巧的exploit生成工具,可以写自定义的shellcode代码,生成演示例子按钮是弹出计算器的代码。程序如图(11)

    图片11

     (图11)

     我们运行演示例子会发现,当程序载入了exp.smv文件后,弹出来了计算器。如图(12)如果这个代码不是一个执行计算器的代码,而是一个病毒呢?

    图片12

      (图12)

    2:易语言5.11的缓冲区溢出漏洞
    漏洞编号: WooYun-2013-44371
    链接:http://www.wooyun.org/bugs/wooyun-2010-044371
    漏洞分析:
    在处理函数的时候,未对长度进行有效检测,可导致缓冲区溢出。执行特定构造的源程序,打开程序即可触犯漏洞,可导致任意代码执行。
    挖掘思路:
    1.安装易语言后,分析其挖掘点。各种编辑框,输入信息等等都可以作为挖掘点,效果最好,影响最大的挖掘点,还要属于易语言工程文件(.E文件)。
    2.超长长度字符串一般都可作为挖掘点的首选。我这里对“信息框”控件做一次手动的挖掘展示。新建一个窗口,拖放一个按钮。双击按钮后弹出代码编辑区。这里输入信息框 (“xxxxxxxxxxxxxxxxx”, 0, ),然后观看效果。如图(13)

    图片13

      (图13)

    下一步,我们手动尝试把变量字符串变得很长,很显然,xxxxxxxx这里就是变量字符串,我们输入很长的字符串(大约2000H个) 保存。然后打开易语言,载入这个.E源文件(或者直接打开.E源文件也可以),发现程序莫名其妙的退出了。我们用调试器OllyDbg打开易语言程序,然后载入这个我们构造的.E源文件。如图(14)

    图片14

      (图14)

    这时候发现,EIP已经为78787878,已经被我们所控制。看一看SEH链表,会发现SEH链表已经被我们所控制。如图(15)

    图片15

      (图15)

    接下来就可以用pop pop retn的方法来利用了。原理和上面相同。程序有一些自校验,解决办法:第一种是对shellcode进行编码,直接在.E源码内增加编码后的shellcode。第二种逆向易语言自校验算法并尝试突破,直接用winhex等工具对.E文件修改shellcode,在修改自校验相关代码。绝大部分情况下,第一种更为容易些。

    0X03 通用fuzz法进行漏洞挖掘:

    • 什么是通用FUZZ:

    在不研究文件格式的情况下,用自动化测试工具对目标程序进行fuzz测试。

    • 通用FUZZ的过程:

    通用fuzz的步骤如下:
    1.选取目标文件。
    2.用我们的工具对目标文件的格式进行变异,生成大量的畸形样本。
    3.让程序分别载入并解析这些畸形样本,监测程序是否会触发异常。
    4.通过逆向分析这些异常样本,查看是否是漏洞同时确定危害级别。

    • 通用FUZZ优点:

    上手容易,不需要了解文件格式即可对目标进行漏洞挖掘。全自动化,效率很高。

    • 通用FUZZ缺点:

    测试深度不够,只适合一些文件结构较为简单的文件格式,对复杂的文件格式无能为力。

    • 通用FUZZ重点:

    评价一个通用fuzz工具的好坏,一般考虑以下两个方面
    1.生成的样本是否足够畸形:只有样本足够畸形,才能保证覆盖面足够大,才能挖掘出更多的安全隐患。
    2.监控功能是否足够的强大准确:通用fuzz的监控模块可以准确的监控到程序运行时所发生的异常。不误报,不漏报。

    • EASYFUZZER介绍:

    EasyFuzzer是一款精简高效的模糊测试工具。目前只支持文件格式的模糊测试。支持通用fuzz格式和智能fuzz格式。目前最高版本为1.5。要求运行环境为windows xp sp3 32位。下载地址:http://www.asm64.com/Soft/EasyFuzzer1.5BETA.zip

    Easyfuzzer特点:
    容易:不需要什么配置,非常容易上手,使用也非常简单。
    精简:为了容量和速度,软件采用100%汇编语言编写。排除了以往fuzzer的无用功能。绿色软件,无毒无害。
    高效:
    由于采用汇编语言编写,并且支持多线程fuzz和分布式fuzz,因此速度极快,效率极高。
    灵活:
    大家在用其他工具fuzz时候,经常会把一些正常的某些行为报成异常行为,原因是一些非异常的“异常”被fuzzer捕捉到了。EasyFuzzer具有忽略异常调试功能,这样大大降低了 fuzzing时的误报率。
    高级:支持智能fuzz,可以由用户自定义文件格式样本。可以挖掘复杂文件格式的漏洞。

    程序功能简介:

    图片16

      (图16)

    主窗口如图(16):
    样本文件:通用fuzz测试时,根据该样本来生成各种畸形样本。选取一个正常的样本即可。为了提高测试速度,样本应该包含尽量多的数据结构,而样本的容量也应该尽量小。
    目标路径:存放生成畸形样本的文件路径。
    后缀名:样本的后缀名。
    宿主程序路径:要挖掘程序的路径。如果程序启动需要参数,请把参数输入到后面的编辑框中。
    对于通用fuzz,提供了两个生成样本的引擎
    引擎1:主要针对整数溢出fuzz而开发的引擎。适合文件格式较小的样本,如果文件格式较大请选择挖掘范围。否则会生成太多的测试样本,影响测试效果。
    引擎2:主要针对堆栈缓冲区溢出而开发的引擎。如果你的时间比较充沛,可以选择后面的x2 x4 x16选项。这样样本生成量就会增加,测试深度增加。该选项可以复选。例如如果全部选择则表示样本量*128倍。在1.5版本下,这样要生成大约25万个样本。
    生成文件:(针对通用fuzz而言)根据所选择的样本来生成文件。
    Fuzzing:开始fuzzing测试。
    停止:提前结束fuzz测试。
    总在最前面:如果讨厌fuzz的时候,新启动窗口挡住我们的程序,可以选择这个选项。

    图片17

     (图17)

    fuzz选项窗口如图(17):
    运行时间:
    样本监控的时间,超过这个时间没有监控到异常程序就会退出。根据你的硬件配置和目标程序来选择。过小的时间会导致测试无法正常执行,而过大的时间又导致资源的浪费。
    开启速率:样本启动速率,就是多长时间程序开启一次。这个时间也是根据你的机器配置和目标程序来选择。如上图运行时间为2000ms,开启速率为500ms,那就是相当于程序是保持4线程运行。
    异常日志有效路径:存放异常日志的路径。当程序发生异常的时候,异常日志都会存放在所选路径。
    忽略以下异常:有时候由于要挖掘程序的设计问题,正常情况下也会抛出一些异常。这个功能就是忽略这些异常,不截获这些异常。减少误报,提高效率。
    开启自定义样本功能:可以接受第三方程序生成的畸形样本。也可以用于继续fuzz上一次没有fuzz完毕的样本。只需填写样本总数和样本开始数即可。
    开启分布式挖掘:用于多台机器(或者虚拟机)挖掘一个程序。比如一个程序需要测试10000个样本,如果你开启5个虚拟机,那么在这5个虚拟机都安装上该软件,机器总数写5,机器编号分别写1,2,3,4,5 然后每一个虚拟机只需要测试2000个样本即可完成任务。
    智能fuzz窗口:如图(18)该窗口比较简单,只是一个代码编辑区。输入代码后填写后缀名。点击确认即可生成样本。

    图片18

      (图18)

    • 通用FUZZ漏洞挖掘举例:

    下面举一个通用fuzz的例子,用easyfuzzer来进行软件的漏洞挖掘。我们选取的目标仍然为sdemo 2.0。
    挖掘过程:样本的生成:首先,我们生成一个非常小的正常样本文件。命名为sample.smv。然后,打开easyfuzzer,填写要生成指令的一些参数,前面已经做了详细说明。具体如图(19)

    图片19

      (图19)

    我们这里选择引擎2来生成样本,如上图所示,这时候已经生成完毕。图(20)为生成的样本

    图片20

      (图20)

    样本的测试:配置信息默认即可,这时候我们点击fuzzing,对样本进行fuzz。下图是fuzz过程 如图(21)

    图片21

     (图21)

    时间问题,提前结束了测试。这时候主窗口已经显示了一些监控结果。如图(22)随便打开一个异常日志,里面存有出错样本ID和一些出错的信息。之后我们找到该ID的样本验证下,程序果然崩溃了。

    图片22

      (图22)

    0X04 智能fuzz法进行漏洞挖掘:

    • 智能FUZZ介绍

    什么是智能fuzz:智能fuzz是相对于通用fuzz而言的。通用fuzz虽然在简单文件格式的fuzz下做到了快,狠,准的优点。但是对于复杂文件格式就无能为力了。因为复杂文件格式中有大量的结构校验。对于这种校验,通用fuzz生成的样本大部分是无效的。因此这里引用了智能fuzz。智能fuzz是对文件的结构进行分析,编写出表述文件结构的代码。然后fuzzer工具根据该代码的约束生成畸形样本,接下来就和通用fuzz相同了:执行畸形样本,监控异常。
    智能fuzz的优点执行效率高,效果好。可以挖掘其他方法挖掘不到的软件漏洞。
    智能fuzz缺点:需要深入研究相应的文件格式,并写出相应的文件格式脚本。该过程需要的时间较长。
    智能fuzz的步骤:
    1.研究要挖掘程序处理的相应文件格式,包括该格式的各种数据结构,约束规则等信息。
    2.根据fuzzer规定的代码规则,编写相应规则的代码,来解析当前文件格式的结构。
    3.用fuzzer工具通过我们写的代码,生成大量的畸形样本。
    4.让fuzzer 执行并监控被挖掘程序处理畸形样本的运行情况,检测程序是否发生异常,如果异常保留异常样本和相关信息。
    5.用OLLYDBG WINDBG IDA等工具深入分析崩溃信息,查看是否是漏洞同时确定危害级别。

    • EASYFUZZER 智能FUZZ模块介绍:

    下面举一个智能的例子,用来进行软件的漏洞挖掘。首先说一下的代码规则。在easyfuzzer 1.5版本,最多支持条代码,每条代码的长度最多为字节。每一条代码必须用“;”结尾,参数之间用“,”分割。到1.5为止,easyfuzzer共支持4种指令。

    第一种:_num,参数1,参数2,参数3,参数4;如:_num,100,1,0,32;_num有四个参数:
    参数一:是数值, 支持10进制类型(如 100,1234567),也支持16进制类型(如100H,deaddeadh),16进制字母大小写都可以,后面需要加h来和10进制数据加以区分。
    参数二:是数据是否可以变异,0为可以变异,1为不可以变异。变异是指以后生成的不同的样本中该数值都会进行变化。如果该数值设置成1(可以变异),那么对于参数一无论设置成什么值,也都没有什么区别了(参数一不进行解析了)
    参数三:大小尾。 0表示小尾(小尾表示低位数据存储在低字节地址空间上),1表示大尾(大尾表示低位数据存储在高字节地址空间上)。比如12345678H  如果是大尾,在内存中是12345678,如果是小尾,在内存中是78563412,
    参数四:数值的大小,目前支持8位,16位,32位3种类型。  也就是1字节,2字节,4字节。8位 如AAH。16位 如AABBH。32位 如AABBCCDDH。
    以下表示都是正确的

    第二种:_str,参数1,参数2,参数3 ,参数4, 参数5 ,参数6;如:_str,helloworld,1,0,0,32,1;该函数有六个参数
    参数一:字符串值。直接填写字符串即可如 helloworld。
    参数二:该数值是否变化。0表示变化,1表示不变化。
    参数三:字符串的长度,单位为字节。
    参数四:字符串类型,0表示STR类型,1表示HEX类型。如123456,如果是0,输出后内存中的数据是313233343536,如果是1,输出后内存的数据是123456.
    参数五:前缀的大小。单位是字节数。有效值为0,8,16,32。前缀用来表示该字符串的长度。如果您不需要该数值,设置成0就可以。
    参数六:前缀的格式, 大尾或者小尾。 0表示小尾,1表示大尾。

    第三种:_cal,addr,参数1,参数2,参数3;  如: _cal,addr,32,0,3;该函数共有三个参数:
    参数一:表示计算结果的位数。 可选值为 8,16,32   分别表示8位,16位,32位。(即1字节 2字节 4字节)
    参数二:结果的大小尾, 0表示小尾,1表示大尾。
    参数三:计算目标(函数序列号)  上面例子是3,就是计算第三个函数的偏移地址。

    第四种:_cal,size,参数1,参数2参数3参数4;  如:_cal,size,32,0,4,6;该函数共有4个参数:
    参数一:表示计算结果的位数。 可选值为 8,16,32   分别表示8位,16位,32位。(即1字节 2字节 4字节)
    参数二:结果的大小尾, 0表示小尾,1表示大尾。
    参数三:开始函数(函数序列号)
    参数四:结束函数(函数序列号)。上例中,开始是4,结束是6,就是计算4-6 共3个函数的大小。注意:开始函数值不应该大于结束函数值

    • 漏洞挖掘举例:挖掘WINXP SP3系统播放器的内存破坏漏洞

    我们的目标是windows xpsp3的媒体播放器我们这里选择一款简单的文件格式:Mid文件格式。下面是mid文件格式简介。
    1.mid文件格式简介:一个MIDI文件基本上由两个部分组成,头块和轨道块。 具体信息请去互联网自行搜索。
    2.头块:头块出现在文件的开头,头块看起来一直是这样的:4D5468640000 0006 ffff nnnn dddd。4D5468640000表示头块的标示值;ffff是文件的格式;nnnn 是MIDI文件中的轨道数;dddd 是每个4分音符节奏数。
    3.轨道块:4D54726B xxxxxxxx aaaaaaaaaaaaaaaa。4D54726B 表示轨道块的表示值;aaaaaaaa表示轨道块;xxxxxxxx表示轨道块的大小。除了头块和轨道块的标示值以外,所有的结构都应该作为fuzz的结构,就是说内容可以变异。下面是我根据我对mid文件结构的了解,编写的一段代码:

    代码的含义:
    第一行代码:头信息为MThd,长度为6的字符串类型;
    第二行代码:第一行代码解析字符串的长度,要求大尾形式。并且大小是16位;
    第三行代码:一个16位的数据,数据需要变异;该数值为变异数值,所以第一个参数(FFFFH)是不解析的,写什么都一样;
    第四行和第五行类似于第三行;
    第六行类似与第一行;
    第七行:取第八行代码生成数据的大小;
    第八行:字符串类型,需要变异。表示轨道块。
    代码写完毕后,我们点击确定来生成代码。很快代码就生成完毕了,如图(23)图(24),一共生成了11137个畸形样本。

    图片21

     (图23)

    图片24

      (图24)

    下一步我们就可以开始fuzz了。如果你从来没有运行过系统播放器,请先运行配置一下,否则无法成功fuzz。另外,WinXP系统播放器是不支持多线程的,因此我们需要让开启速率的时间大于运行时间。这里我们把开启速率设置成2200毫秒,运行时间设置成2000毫秒。设置完毕后点击确定。如图(25)

    图片25

      (图25)

    由于我们是靠代码生成的样本,因此就不需要模板文件了,如下图。然后点击FUZZING按钮。如图(26)

    图片26

      (图26)

    为了观察方便,您可以把总在最前面按钮选上。下面就是fuzz过程了,这个过程时间较长。按照我的选项,完全测试完毕需要6个小时,为缩短时间你可以多开几个虚拟机选用分布式挖掘。在一个i7 pc级cpu中,完全可以开6个虚拟机(需要较大的内存)这样一个小时就足够了。由于时间原因,我这里提前结束了fuzz。好消息是,我已经找到畸形样本了。如图(27):

    图片27

      (图27)

     这时候我们去看看日志。如图(28)。

    图片28

      (图28)

    日志显示,因为除以0导致了崩溃。 我们下面手动测试下。找到00000000.mid 和00000043.mid样本。我们od来验证下,是不是因为除以0导致的崩溃。如图(29)图(30)。

    图片29

      (图29)

    图片30

      (图30)

    正如日志信息所说,因为除以0导致崩溃。有关该漏洞的详细信息,您可以访问:http://www.wooyun.org/bugs/wooyun-2010-060863。

    0X05 总结:

    关于二进制漏洞挖掘,本文只讲述了最主流的三种漏洞挖掘方法。漏洞挖掘的方法有很多,没有哪种方法是可以否认的。只要能挖掘出漏洞的方法就为好方法。正因为如此,与其说漏洞挖掘是一门技术,不如说他是一门艺术。更多的漏洞挖掘方法,有待大家去探索与发现。

    最后说一下对于新手的一些建议:懂开发,这样便于我们从程序员的思维上去理解程序,知彼知己方能百战不殆。懂逆向,善于调试程序,了解代码最底层的运行机制。多分析漏洞,举一反三,触发灵感。多尝试挖掘漏洞,而不是纸上谈兵,经验最重要。

    展开全文
  • 今年的议题更多集中在二进制漏洞挖掘上,占比43%,而这些议题涉及(Windows、macOS、IoT、工控等等),其它议题方向包括恶意软件、二进制分析工具、容器安全、漏洞奖励计划等等,可以看出当前工业界的一些研究议题...

    本周Hack In The Box官方已经将大会演讲视频上传到YouTube,之前在官网有提供部分议题的pdf下载,但有些未提供的议题,这次也公开了视频,可以看到议题ppt内容。

    今年的议题更多集中在二进制漏洞挖掘上,占比43%,而这些议题涉及(Windows、macOS、IoT、工控等等),其它议题方向包括恶意软件、二进制分析工具、容器安全、漏洞奖励计划等等,可以看出当前工业界的一些研究议题,还是比较喜欢二进制漏洞挖掘这个方向,这次一个Web相关议题都没有。

    精彩议题推荐

    1、60 CVEs in 60 Days

    主要分享Windows平台下高权限进程的Symlink攻击(高权限进程在操作文件时,未作严格的权限校验,导致攻击利用符号链接到一些受保护的目录文件,比如C盘的系统DLL文件,后面系统或应用去自动加载时,实现代码执行并提权),这种攻击方式最早是由Project Zero大牛James Forshaw公布的,当时还开源了个利用测试工具(https://github.com/googleprojectzero/symboliclink-testing-tools)  ,指定目录参数来测试,但它还算不上完整的漏洞挖掘工具。

    漏洞原理较为简单,关键在于如何批量自动化挖掘,为此作者实现了一款叫 Ichanea 的自动化漏洞挖掘工具。

    原理:通过过滤驱动捕获文件操作相关的IRP包,然后获取归属进程的相关信息,包括路径、进线程token等等,然后判断是否为高权限进程,若是就拿Token去检测文件的访问权限,如果可以就发消息给高权限的服务进程,创建/RCP/Control的加载点及符号链接进行DLL劫持测试,从而将监控、发现和利用集成一体。

    最后在26家厂商(包括微软、Intel、Adobe、华为等等)产品中,挖到上百个漏洞,其中已有60个CVE致谢,产量颇丰。

    2、Pwning Adobe Reader Multiple Times with Malformed Strings

    腾讯玄武实验室出品,分享Adobe Reader在处理字符串时的安全问题。通过PDF JS来构造恶意字符串去触发,JS上的漏洞也更便于写exploit。虽然Adobe用了一些自定义的字符串安全处理函数,但其使用不当导致仍会造成漏洞。主要有两方面原因:

    1、传错参数,比如拷贝字符时max_bytes参数误传0x7FFFFFFF,可能造成溢出;

    2、字符串类型检测不当,比如误将ASNI当作Unicode字符串处理,千万类型混淆漏洞。

    感觉这个攻击面还是有点偏门,找到一块新大陆,刷起漏洞来应该很爽,但估计也就一波过,可能没剩下啥了。

    3、Exploiting directory permissions on macOS

    有点类似前面Windows Symlink攻击提权的思路,介绍了macOS下系统对文件及目录的权限管控方式,用fs_usage去监控进程的文件操作行为,从而找出一些可能被用于提权的目录/文件。利用的正是文件与目录高低权限的差异化,借助软硬链实现对受保护文件的越权操作。有些只能写,但内容不可控,或者只能删除,也有可被用于root提权的漏洞。最后作者也简单地介绍一些文件操作方面的安全建议,比如对于安装器,若是/tmp就生成随机名目录,其它的要控制好权限,比如就root权限,其它则收回,安装前清理目录,删除移动文件时避免支持链接方式等等。

    4、Documents of Doom – Infecting Macos Via Office Macros

    以前Office宏病毒在Windows还是流行过一段时间的,其实macOS上也有,作者就列举了2017、2018、2019年的三次真实的宏攻击案例,也介绍了olevba之类的分析工具。

    除此之外,还介绍了一些mac版Office沙盒逃逸的漏洞,用户打开doc后,可以无提示无交互的实现代码执行。作者自己也挖过一个沙盒逃逸漏洞,正是利用Python这条漏网之鱼,于用它将app添加版系统的自启动项,实现非沙盒下的执行权限。

    5、Fuzzing File System Implementations to Uncover Security Bugs

    PPT上写的关键信息不多,但重要的是作者把工具开源了,针对BSD文件系统(支持FFS、UFS、EXT、ZFS文件系统格式)进行Fuzzing,工具地址:https://github.com/0xricksanchez/fisy-fuzz  。所以重点可以看下该工具,支持Ubuntu,要求KVM、QEMU和libvirt,采用的是暴力Fuzzing 文件系统,直接用到了radamsa,自己也作了全局的随机变异,然后尝试加载,若加载成功就调用syscall执行一些文件操作,看是否崩溃,最后再借助虚拟机快照还原运行环境。

    完整议题列表

    1. 60 CVEs in 60 Days

    2. The State of ICS Security: then and Now

    3. Pwning Adobe Reader Multiple Times with Malformed Strings

    4. Open the Gates – the (In)Security of Cloudless Smart Door Systems

    5. Hiding in Plain Sight: Analyzing Recent Evolutions in Malware Loaders

    6. Building Next-gen Security Analysis Tools with Qiling Framework

    7. Exploiting Directory Permissions on macOS

    8. Documents of Doom – Infecting Macos Via Office Macros

    9. From Man-in-the-Middle to Privesc and Rce: Exploiting the Netlogon Protocol

    10. The Dna of Hidden Cobra – a Look at a Nation State’s Cyber Offensive Programs

    11. Prisoner Number 6

    12. Fuzzing File System Implementations to Uncover Security Bugs

    13. Breaking and Securing Cloud Platforms

    14. Army of Undead: Tailored Firmware Emulation

    15. Bugrank: a Community Bug Bounty Platform

    16. Virtual Lab: Bare-metal Reverse Engineering & Hardware Hacking

    议题ppt及视频地址参见:https://conference.hitb.org/lockdown-livestream/

    更多推荐

    谈谈追踪前沿学术研究的技巧 技术人的修炼之道:从业余到专业 关于Adobe PDF 0day的故事 Google新书:《构建安全可靠的系统》        
    展开全文
  • 二进制漏洞与利用学习

    千次阅读 2017-07-24 10:40:14
    二进制漏洞与利用学习 一、主要术语 Binary:由编译类语言生成的可执行程序 Vulnerability:Binary中包含的可被利用的Bug Exploit:借助Vulnerability来劫持Binary控制流的、经过特殊构造的数据 0day:可被exploit...

    二进制漏洞与利用学习
    一、主要术语

    • Binary:由编译类语言生成的可执行程序
    • Vulnerability:Binary中包含的可被利用的Bug
    • Exploit:借助Vulnerability来劫持Binary控制流的、经过特殊构造的数据
    • 0day:可被exploit的位置Vulnerability
    • Pwn:发现Vulnerability以及开发exploit的工作

    二、目的:

    • 获取shell
    • 获取计算机上的敏感信息
    • 上串并安装Malware
    • 对计算机实施破坏

    三、根本原因:
    (1)通道问题:

    • 计算机中数据和控制通道隔离性差
    • 存在从数据通道信息转移到控制通道的可能

    (2)逻辑问题

    • 对边界条件的检查不完善
    • 对内存管理不善
    • 逻辑不严谨或太复杂

    四、分类:

    • Stack-Based
    • Heap-Based
    • Integer Issue
    • Pointer Issue
    • Format Strig Vulnerability
    • Race Condition

    五、基础知识(Knowledge Base)

    • ELF:linux中可执行文件
    • PE:windows下可执行文件
      ELF文件格式

    • PLT:程序局部表

    • GOT:全局偏移表
    • X86指令大小不固定,不对齐,ARM指令大小为4B,且对齐(Aligned)

    六、防护机制:
    1.NX/W^X
    (1)解释:数据页不可执行,代码页不可写
    (2)Bypass:

    - ret2lib:令控制流跳转到库代码中执行
    - ROP(Return Oriented Programming):从内存中寻找Gadget(每个Gadget都以return结尾,返回调用该函数的代码所在的rip后的地址)并将其组成具有一定功能的代码 ,可以用RoPgadget寻找GadGet
    

    2.ASLR:
    (1)解释: 内核、堆栈、动态库的加载地址具有随机性
    开启PIE的情况下,主程序的加载基地址也随机
    (2)Bypass:

    - 爆破
    
                    32位环境,linux libc的加载基址为0Xf7xxx000
    
    -  信息泄露:
    
                    获取GOT表(含大量函数指针)的内容
                    获取main函数返回地址
    

    3.Stack Guard
    Canaries/Cookies:在栈中的局部变量和返回地址间插入一个难以预测的值(Canary),当函数返回时,将检查Canary是否被破坏
    4.StackShield:
    将返回地址拷贝到影子栈中,返回时比较栈上的返址与影子栈中的返址
    5.SSP
    编译时对变量重排序,将函数指针放在低低址,缓冲区放在高地址

    展开全文
  • 0x10 环境 ...测试程序(即带有栈溢出漏洞二进制可执行文件) 虚拟机装有 Linux 发行版,例如 Ubuntu、Kali,用来运行测试程序 测试程序下载地址 1 链接:https://pan.baidu.com/s/1U3ktIz-veMuktuts...
  • 本文是本系列的第二篇,将对面向二进制程序的静态漏洞挖掘技术进行介绍分析。 面向二进制程序的静态漏洞的挖掘技术由于缺少源代码中的结构化信息,面临着值集分析(vaule-set analysis,VSA)控制流恢复不精确的...
  • 二进制漏洞实例分析

    2017-03-15 17:20:21
    Windows和Linux下的漏洞涵盖方方面面,本文将从Windows和Linux下漏洞入手,拣选一些易...希望通过本文的训练,学员能够掌握基本二进制漏洞调试方法,激发同学对二进制漏洞的兴趣,为将来的漏洞挖掘,漏洞利用打下基础。
  • PWN 前言 信安出征,寸草不生。 世界万物皆可pwn,除非你内力不够深厚,pwn不是你成为...仰望星空,脚踏实地,狭义的pwn是指挖掘二进制程序的漏洞,编写漏洞利用脚本破解程序,拿到主机的权限。需要了解二进制程序的特
  • 如果定义一个无符号的8位二进制数,超过255,则溢出,比如 unsigned char a = 257,那么实际 a = 1 (循环) 。 找到漏洞点,并且介绍了溢出的规则,那么我们要怎么利用这个漏洞呢? 这里还有一个问题是代码的17行...
  • 二进制漏洞挖掘之栈溢出-开启FORTIFY

    千次阅读 2019-10-18 15:23:49
    二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • 通过对以往二进制挖掘模型的研究,提出了一种新的二进制代码整数型漏洞挖掘方法模型,该模型综合运用了Fuzzing、逆向工程和符号执行等相关技术。首先利用逆向分析锁定整数漏洞相关的代码部分,获得数据相关类型...
  • 二进制漏洞挖掘之栈溢出-开启PIE

    千次阅读 2019-10-18 14:56:57
    二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • Linux二进制漏洞利用——突破系统防御的关键技术.pdf
  • 使用file命令列出该二进制文件的详细信息 0x31 静态分析动态调试 有两个关键点,一是该程序是64位的ELF可执行程序,所以要用64位的IDA进行反汇编操作;二是stripped过,也就是说,反编译的代码可能是没有变量名称...
  • 本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器。 0x01栈溢出漏洞原理 栈溢出漏洞属于缓冲区漏洞的一种,实例如下: #include <stdio.h> #...
  • 二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • 二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • 二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • 二进制各种漏洞原理实战分析总结 0x01栈溢出漏洞原理 0x02 堆溢出漏洞原理 0x03 堆调试技巧 堆尾检查 页堆 0x04整数溢出漏洞原理 基于栈的整数溢出 ...
  • 深究起来,堆管理器(ptmalloc)会检查其物理相邻的堆块(chunk)是否空闲,如果空闲,则需要将其从所在的 bin (small bins)中释放出来,当前 free 的 chunk 进行合并,合并之后,再插入到 unsorted bins 中。...
  • 二进制漏洞挖掘之栈溢出-开启RELRO

    千次阅读 2019-10-18 15:11:53
    二进制漏洞-栈溢出 github地址:https://github.com/ylcangel/exploits/tree/master/stack_overflow 你可以用于学习,但不能用于商用(如出书、以盈利为目的的课程、文章等),转载需标明出处。 测试平台 系统:...
  • 关于格式化字符串漏洞利用,可参见:ASIS CTF 2020_full_protection: 格式化字符串栈溢出的利用 0x40 总结 对于格式化字符串漏洞,32 位和 64 位的程序是有所不同的。借助于先知社区上的一张图片,32 位程序 ...
  • 列表不定期更新,有遗漏的地方还望各位留帖补充:Plast update: 2019.04.05 从漏洞、漏洞利用、Fuzz、利用缓解四...『二进制漏洞分析』学习资源整理https://bbs.pediy.com/thread-221851.htm 基础知识: Win...
  • 二进制安全学习路线

    千次阅读 多人点赞 2019-08-14 23:35:17
    本文作者:rkvir(二进制小组组长) 转自某推文,链接找不到了。 一. 什么是二进制安全 在很久以前安全圈并没有把安全技术做出一个特别清晰的分类。在大部分人眼里,所谓的黑客,安全研究者指的就是研究渗透入侵...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,566
精华内容 1,026
关键字:

二进制漏洞挖掘与利用