操作系统   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. Optimizing and caching browser bundles...

    扎心了,老铁!!! 他妈的,弄了几天都是卡在这里!!上网查了一下.说是我的内存不够,好吧.我慢慢等,然而让我等了好几天都没什么反应..两天了,一直卡在这里.今天在虚拟机也是发狠了. 我直接把虚拟机的内 ...

  2. Week 5: Object Oriented Programming 9. Classes and Inheritance Exercise: int set

    class intSet(object): """An intSet is a set of integers The value is represented by a ...

  3. 鼠标拖动div,div跟随鼠标移动效果

    <div id="boxDiv" style='width:20px;height:20px;position:absolute;background:red;'>   ...

  4. 为什么Kafka那么快,明显领先其他mq?

    经常看到有很多Kafka的测试文章,测试结果通常都是“吊打”其他MQ.感慨它的牛B之余我觉得必要仔细分析一下它如此快速的原因.这篇文章不同于其他介绍Kafka使用或者技术实现的文章,此处我会重点解释— ...

  5. ibaits数组形式批量入库

    一.xml层 <!--批量入库--> <insert id="addSecCodeList" parameterClass="java.util.Has ...

  6. ZABBIX 监控基本报警故障

    CPU触发器: 1)Processor load is too high on {HOST.NAME} {HOST.NAME}上处理器负载太高 触发器表达式:{Zabbix server:system ...

  7. API-Framework 前后端分离

  8. (转)[Shell]tr命令详解

    原文:http://blog.csdn.net/sunnyyoona/article/details/52986893 1. 用途 tr,translate的简写,主要用于压缩重复字符,删除文件中的控 ...

  9. 15019:Only the instance admin may alter the PermSize attribute

    15019:Only the instance admin may alter the PermSize attribute TimesTen提示空间不足,增加空间重启后提示15019:Only th ...

  10. java线程中的 sleep() wait() yield()

    sleep()方法是让线程休眠  可以指定时间  其实就是让线程进入阻塞状态  指定的时间过后 进入就绪状态  不释锁 相当于抱着锁睡觉 wait()  让线程进入等待状态  被唤醒后才会继续执行   ...