Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出
操作系统 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_整型溢出的更多相关文章
- Linux漏洞分析入门笔记-Off-By-One(栈)
ubuntu-16.04.5(X86) IDA7.0 0x00.漏洞描述 1.什么是off by one?又称1字节溢出. 源字符串长度等于目标缓冲区长度时,将源字符串复制到目标缓冲区可能会导致off ...
- Linux漏洞分析入门笔记-CVE-2015-0235
Ubuntu 12.04 32位 ida 7.0 0x00:漏洞描述 1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数 ...
- linux漏洞分析入门笔记-bypass_PIE
ubuntu 16.04 IDA 7.0 docker 0x00:漏洞分析 1.ASLR的是操作系统的功能选项,作用于executable(ELF)装入内存运行时,因而只能随机化stack.heap. ...
- linux漏洞分析入门笔记-栈溢出
ida7.0 ubuntu16.04 lts 0x00:环境配置 使用IDA远程调试Linux程序步骤如下: 1. 在进行远程调试之前需要对Linux平台进行一些准备工作.在IDA的安装目录中的dbg ...
- CVE-2018-14634 - Linux create_elf_tables()中的整型溢出 - 翻译
原文:https://seclists.org/oss-sec/2018/q3/274 摘要 Qualys研究实验室的安全团队发现一个位于Linux内核函数create_elf_tables()中的整 ...
- Linux内核分析课程笔记(一)
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...
- C语言的整型溢出问题
整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...
- 记录: 一次解决整型溢出攻击(使用scala,隐式转换)
最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议 ...
- linux内核分析课程笔记(二)
运行一个精简的操作系统内核 存储程序计算机是几乎所有计算机的基础逻辑框架. 堆栈是计算机中非常基础的东西,在最早计算机没有高级语言时,在高级语言出现之前,我们没有函数的概念.但高级语言出现后有了函数调 ...
随机推荐
- 搭建git服务器(临时服务器,命令行形式,针对2到5人左右,轻量)
服务端配置 ############################################################################################## ...
- SSM整合dubbo 进行分页查询
1.先书写Mapper和sql语句 public interface ActEntityMapper { int deleteByPrimaryKey(String actId); int inser ...
- 【算法笔记】B1007 素数对猜想
1007 素数对猜想 (20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“素数对猜想 ...
- 数独求解问题(DFS+位运算优化)
In the game of Sudoku, you are given a large 9 × 9 grid divided into smaller 3 × 3 subgrids. For exa ...
- SPOJ - REPEATS RMQ循环节
题意:求重复次数最多的重复子串(并非长度最长) 枚举循环子串长度\(L\),求最多能连续出现多少次,相邻的节点往后的判断可以使用\(LCP\)得到值为\(K\),那么得到一个可能的解就是\(K/L+1 ...
- Java正则表达式-捕获组
private Set<String> getCodes(String s) { Set<String> resultSet = new HashSet<>(); ...
- hadoop 配置安装
1. 下载hadoop 压缩包, 拷贝到 /usr/hadoop目录下 tar -zxvf hadoop-2.7.1.tar.gz, 比如: 127.0.0.1 localhost 19 ...
- 认识CSS中css背景样式设置
前端之HTML,CSS(五) CSS CSS背景 CSS可以添加背景颜色和背景图片,也可以对图片进行设置.设置的样式有: background-color 背景颜色 background-image ...
- ansible 实战项目之文件操作(二)
一,前言 如果没有安装好的话看我以前的贴子哦!! 上次安装已经确定通了,所以下面步骤应该是完全ok的 特点: (1).轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可: (2 ...
- shell 进阶之匹配字符串
一,操作字符串 1,字符串长度 expr 命令取字符串函数 自带shell函数读取 2,匹配字符串开头字串的长度 !!!!!!!!!!!!$substring是正则表达式.!!!!!!!!! ...