Ubuntu 12.04 32位

ida 7.0

0x00:漏洞描述

1.glibc的__nss_hostname_digits_dots存在缓冲区溢出漏洞,导致使用gethostbyname系列函数的某些软件存在代码执行或者信息泄露的安全风险。

通过gethostbyname()函数或gethostbyname2()函数,将可能产生一个堆上的缓冲区溢出。经由gethostbyname_r()或gethostbyname2_r(),则会触发调用者提供的缓冲区溢出, 漏洞产生时至多sizeof(char* )个字节可被覆盖(因为char*指针的大小,即32位系统上为4个字节,64位系统为8个字节)。

0x01:漏洞分析

1.先静态分析glibc源码中的__nss_hostname_digits_dots函数流程,如图1所示。

          图1

图1代码大致流程就是在__nss_hostname_digits_dots中,计算了size_needed,当size_needed > buff_size时,会调用realloc重新申请size_needed的空间。

          图2

图2代码流程在计算size_need时,少加了一个sizeof(*h_alias_ptr),少算了4个字节,所以当name全为数字或者.号时,会将name拷贝到buff的hostname,造成一个指针大小字节的堆溢出。

所以要触发成功需要满足的条件为,size_need足够大,让其调用realloc重新分配。name全为数字或者.号。

2.选择一个受漏洞影响的程序clockdiff来调试分析,在IDA中对__nss_hostname_digits_dots下好断点,如图3所示:

          图3

F9运行,第一次断下无用不是处理我们自己输入的参数,直接跳过。第二次断下,发现gethostbyname的参数为我们输入的参数。Gethostbyname中调用__nss_hostname_digits_dots,其中缓冲区的大小默认为0x400。在调用realloc处下断点,此时buffer_size= 0x41B,刚好是输入参数的长度,因为size_need大于buffer_size所以须要重新分配空间。

          图4

通过上面的判断与计算空间大小后执行到stcpy处(溢出点),通过前面空间的计算,加上字符串结尾的空字节,刚好溢出了一个指针字节。

0x02:总结

1.产生漏洞的条件是当gethostbyname()函灵敏被调用时且满足下面两个条件。

a.size_need足够大,让其调用realloc重新分配。

b.name全为数字或者.号

Linux漏洞分析入门笔记-CVE-2015-0235的更多相关文章

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

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

  2. Linux漏洞分析入门笔记-CVE_2018_6323_整型溢出

    操作系统   Ubuntu 16.04 /32 位 调试器     IDA pro 7.0 漏洞软件   binutils-2.29.1 0x00: 漏洞描述 1.什么是整数溢出: 在计算机中,整数分 ...

  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. Linux内核分析课程笔记(一)

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

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

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

  7. Linux内核分析 读书笔记 (第十八章)

    第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1.  ...

  8. Linux内核分析 读书笔记 (第四章)

    第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...

  9. Linux内核分析 读书笔记 (第七章)

    第七章 链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行. 2.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于 ...

随机推荐

  1. 【Leetcode】Maximum Product Subarray

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. 在pycharm中使用指定的虚拟环境virtualenv

    第一步 建立虚拟环境 cmd下: pip install virtualenv 创建虚拟环境目录 env 第二步:激活虚拟环境 进入虚拟环境下的script目录 第三步:创建一个flask文件夹并打开 ...

  3. Android 数据库框架GreenDao使用

    1.GreenDao3介绍 (1)基本概念 (2)GreenDao3工作原理 (3)GreenDao优点 (4)GreenDao3版本的改进 2.GreenDao3的相关配置概念介绍 (1)配置项目( ...

  4. [转] python提取计算结果的最大最小值及其坐标

    python提取计算结果的最大最小值及其坐标 我们在fluent当中后处理的时候,可以通过fluent本身得到某些物理量的最大值和最小值,但是我们却无法确定这些最大值和最小值的具体位置.其实我们可以将 ...

  5. nvm安装

    1.下载安装包,地址:https://github.com/coreybutler/nvm-windows 2.解压后,点击 nvm-setup 安装,一路默认安装,next下去 3.打开安装位置,然 ...

  6. MBR为什么不支持3T硬盘

    MBR,全称为Master Boot Record,即硬盘的主引导记录.(是管理硬盘分区的一种模式.升级版是GPT) MBR保存在硬盘的第1个扇区(即硬盘的0柱面.0磁头.1扇区).它由三个部分组成, ...

  7. [转] Spring Integration 系统集成

    [From] http://blog.csdn.net/w_x_z_/article/details/53316618 pring Ingegration 提供了基于Spring的EIP(Enterp ...

  8. Home Web Server 1.9.1 build 164 - CGI Remote Code Execution复现

    一.  Home Web Server 1.9.1 build 164 - CGI Remote Code Execution复现 漏洞描述: Home Web Server允许调用CGI程序来通过P ...

  9. 关于箭头函数的this指向问题

    document.onclick = function(){ // 普通函数的this是在运行的时候才临时绑定的,也就是说,函数不运行,你绝对不可能知道this是谁 // 下面这个函数如果是自调用,t ...

  10. django学习笔记——搭建博客网站

    1. 配置环境,创建django工程 虚拟环境下建立Django工程,即创建一个包含python脚本文件和django配置文件的目录或者文件夹,其中manage.py是django的工程管理助手.(可 ...