操作系统   Ubuntu 16.04 /32 位

调试器     IDA pro 7.0

漏洞软件   binutils-2.29.1

0x00: 漏洞描述

1.什么是整数溢出:

在计算机中,整数分为无符号整数以及有符号整数两种。其中有符号整数会在最高位用0表示正数,用1表示负数,而无符号整数则没有这种限制。另外,我们常见的整数类型有8位(单字节字符、布尔类型)、16位(短整型)、32位(长整型)等。关于整数溢出,其实它与其它类型的溢出一样,都是将数据放入了比它本身小的存储空间中,从而出现了溢出。

2.objdump在读取elf文件时具有无符号整数溢出,溢出的原因是没有使用 bfd_size_type 乘法(unsigned long 类型)。构造特定ELF文件可能导致拒绝服务攻击。

3.objdump可以在你不了解程序文件格式的情况下,读取 ELF header, program header table, sectionheader table 还有反汇编等功能。

4.objdump 用于显示一个或多个目标文件的各种信息,通常用作反汇编器,但也能显示文件头,符号表,重定向等信息。

从源码中可以看到objdump 的执行流程如下:

a. 首先检查命令行参数,通过 switch 语句选择要被显示的信息。

b. 剩下的参数被默认为目标文件,它们通过 display_bfd() 函数进行排序。

c. 目标文件的文件类型和体系结构通过 bfd_check_format() 函数来确定。如果被成功识别,则 dump_bfd() 函数被调用。

d. dump_bfd() 依次调用单独的函数来显示相应的信息。

0x01: 漏洞分析

1.编译下面代码gcc -c test.c -o test生成elf文件。

#include<stdio.h>
int main()
{
printf("Hello World!\n");
return ;
}

2.构造特定ELF文件。

f = open("test", 'rb+')
f.read(0x2c) #Program header table entry count
f.write("\xff\xff") # 65535 FFFF /*程序头表表项的个数*/
f.read(0x244-0x2c-2) #
f.write("\x00\x00\x00\x20") #536870912 0x20000000
f.close()

用readelf读取时提示Number of program headers 这一项被修改为一个很大的值,已经超过了程序在内存中的范围,如图1所示:

          图1

用objdump读取构造后的ELF文件后抛出异常,并且提示了错误的原因,如图2所示:

          图2

3.通过回溯栈调用情况,一步一步追踪函数调用,在关键函数下断点动态调试分析。图3所示产生整数溢出的地方。

          图3

          图4

因为伪造的program_header_table个数为0xFFFF 大于 0,进入读取 program headers 的代码,图4所示。然后在溢出点乘法运算前,eax 为伪造的数值 0x20000000,0x20000000*0x38=700000000,在32位CPU中eax只能存放8位,高位的7被截断,只有8个0。从图4原码中可以看到,在后面的 bfd_alloc() 被调用时,第二个参数即大小为 0,函数里面并没有真正的分配内存成功, 并且给了一个随机的内存值。图5所示。

          图5

在后面程序清场过程中,从 bfd_close_all_done() 到 objalloc_free() ,用于清理释放内存,其中就对 bfd_alloc() 分配的内存区域进行了 free() 操作,而这又是一个不存在的地址,于是就产生了异常。如图6所示:

          图6

执行free后程序异常,最终提示图2所示的信息。

0x02:总结

1.只要转换成 unsigned long 类型 bfd_size_type ,从而避免整型溢出,防止漏洞产生。

Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出的更多相关文章

  1. Linux漏洞分析入门笔记-Off-By-One(栈)

    ubuntu-16.04.5(X86) IDA7.0 0x00.漏洞描述 1.什么是off by one?又称1字节溢出. 源字符串长度等于目标缓冲区长度时,将源字符串复制到目标缓冲区可能会导致off ...

  2. Linux漏洞分析入门笔记-CVE-2015-0235

    Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...

  3. linux漏洞分析入门笔记-bypass_PIE

    ubuntu 16.04 IDA 7.0 docker 0x00:漏洞分析 1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack.heap. ...

  4. linux漏洞分析入门笔记-栈溢出

    ida7.0 ubuntu16.04 lts 0x00:环境配置 使用IDA远程调试Linux程序步骤如下: 1. 在进行远程调试之前需要对Linux平台进行一些准备工作.在IDA的安装目录中的dbg ...

  5. CVE-2018-14634 - Linux create_elf_tables()中的整型溢出 - 翻译

    原文:https://seclists.org/oss-sec/2018/q3/274 摘要 Qualys研究实验室的安全团队发现一个位于Linux内核函数create_elf_tables()中的整 ...

  6. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  7. C语言的整型溢出问题

    整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...

  8. 记录: 一次解决整型溢出攻击(使用scala,隐式转换)

    最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议 ...

  9. linux内核分析课程笔记(二)

    运行一个精简的操作系统内核 存储程序计算机是几乎所有计算机的基础逻辑框架. 堆栈是计算机中非常基础的东西,在最早计算机没有高级语言时,在高级语言出现之前,我们没有函数的概念.但高级语言出现后有了函数调 ...

随机推荐

  1. js new关键字 和 this详解

    构造函数 ,是一种特殊的函数.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中. 构造函数用于创建一类对象,首字母要大写. 构造函数要和new一起 ...

  2. OC语法

    ``` int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSString *S= ...

  3. HTML <form> target 属性

    浏览器支持 所有主流浏览器都支持 target 属性. 定义和用法 target 属性规定一个名称或一个关键词,指示在何处打开 action URL,即在何处显示提交表单后接收到的响应. target ...

  4. R语言批量生成变量(变量名中含有参数)

    我们经常会需要生成这样一类的变量,比如a1,a2,a3...... 这时候我们需要用到这两个函数:get()和assign() get()用法 get()函数只是在环境中搜索该变量名的变量,如果该变量 ...

  5. wamp下localhost目录Your Projects下项目无法打开解决方案

    最近在学PHP,然后可能遇到各种小白问题,记录下来当做自己成长的见证吧: wamp下localhost目录Your Projects下项目无法打开,但是在url中输入项目可以访问到. 解决方案: 注意 ...

  6. bugzilla部署问题

    2018-09-25 1.部署环境 kvm虚拟机内    centos 7 系统    httpd+mariadb+bugzilla 关闭系统selinux.防火墙 setenforce 临时关闭se ...

  7. ibatis配置文件中的XML解析错误The content of elements must consist of well-formed character data or markup.

    在检查过所有的标签名都没有问题的情况下. xml中的小于号属于非法字符. SQL语句中则可能需要小于号,此时就需要用<![CDATA[  ]]>将小于号包裹,如此不会被xml解析器解析. ...

  8. java中的线程(2):如何正确停止线程之3种常见停止方式

    1.常见停止方式 自定义线程,其中含退出标志位,在run中判断它. 使用interrupt()方法中断线程 使用stop方法暴力终止(已经弃用) 2.使用标志位 class TestThread ex ...

  9. spark SQL编程

    1.编程实现将 RDD 转换为 DataFrame源文件内容如下(包含 id,name,age): 1,Ella,362,Bob,293,Jack,29 请将数据复制保存到 Linux 系统中,命名为 ...

  10. Python中将列表转化成矩阵表示

    list1 = [] a = [1,3,4] b = [2,5,6] list1.append(a) list1.append(b) arr = np.array(list1) # 打印arr pri ...