0x01 前言

  • ASLR 是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术
  • 目前 ASLR 技术据我所知对3种情况进行了保护,分别是映像基址随机化、堆栈基址随机化和 PEB / TEB 随机化(有论文为参考)。下面来亲自测试一下,看看地址到底会不会变

  • 实验环境:Windows 10 ,编译器:C-Free

0x02 映像基址随机化

  • 当可执行文件或动态链接库文件被映射到内存时,系统会对其虚拟地址进行随机化(重启系统后会更新地址),示例程序如下(做缓冲区溢出实验的,这里直接拿来用了)

  • 这里准备测试7个数据:(1)msvcrt.dll 基地址及大小(2)msvcrt._cexit 的地址及偏移地址(3)msvcrt.singnal 的地址及偏移地址(3)msvcrt.strcpy 地址及偏移地址(4)msvcrt.atexit 地址及偏移地址(5)msvcrt._fileno 地址及偏移地址(6)msvcrt._setmode 地址及偏移地址。其中第一个是动态链接库,其他都是动态链接库里面的函数。
  • 测试 msvcrt.dll 的基地址及大小的方法,将编译好的程序放入OD保持程序为运行状态

  • 打开 PCHunter 软件,找到刚刚加载的进程,右击在下方显示模块窗口

  • 右击显示所有模块

  • 可以看到 msvcrt.dll 模块的地址

  • 测试动态链接库 msvcrt.dll 中的函数地址及偏移地址的方法,下面是刚刚加载进OD的文件,我们需要找到一个 msvcrt.dll 中存在的函数,这个程序在加载的时候刚好调用了一个(也可以自己编写)

  • enter 进入这个函数,可以看到很多 msvcrt.dll 动态链接库里面的函数

  • 想看某一个函数的内存中的地址,可以直接 enter 进入这个函数,比如 strcpy,0x775a6400 就是内存中的地址,以上就是测试 scvcrt.dll 动态链接库文件中函数地址的方法

  • 之后我测试了10次

  • 汇总一下,根据测试的结果可以发现,msvcrt.dll 动态链接库的基地址会变化,但是函数在动态链接库的偏移地址不会变化,基地址大小不变
msvcrt.dll 基地址 大小
测试 1 0x76180000 0xBF000
测试 2 0x757C0000 0xBF000
测试 3 0x779F0000 0xBF000
测试 4 0x76FD0000 0xBF000
测试 5 0x754B0000 0xBF000
测试 6 0x76CF0000 0xBF000
测试 7 0x74FE0000 0xBF000
测试 8 0x75880000 0xBF000
测试 9 0x77240000 0xBF000
测试 10 0x77520000 0xBF000
_cexit 偏移地址 singnal 偏移地址 strcpy 偏移地址
测试 1 0x761e5f30 0x65F30 0x761d6fe0 0x56FE0 0x76206400 0x86400
测试 2 0x75825f30 0x65F30 0x75816fe0 0x56FE0 0x75846400 0x86400
测试 3 0x77a55f30 0x65F30 0x77a46fe0 0x56FE0 0x77a76400 0x86400
测试 4 0x77035f30 0x65F30 0x77026fe0 0x56FE0 0x77056400 0x86400
测试 5 0x75515f30 0x65F30 0x75506fe0 0x56FE0 0x75536400 0x86400
测试 6 0x76d55f30 0x65F30 0x76d46fe0 0x56FE0 0x76d76400 0x86400
测试 7 0x75045f30 0x65F30 0x75036fe0 0x56FE0 0x75066400 0x86400
测试 8 0x758e5f30 0x65F30 0x758d6fe0 0x56FE0 0x75906400 0x86400
测试 9 0x772a5f30 0x65F30 0x77296fe0 0x56FE0 0x772c6400 0x86400
测试 10 0x77585f30 0x65F30 0x77576fe0 0x56FE0 0x775a6400 0x86400
atexit 偏移地址 _fileno 偏移地址 _setmode 偏移地址
测试 1 0x761d6ca0 0x56CA0 0x761f3130 0x73130 0x761c9d70 0x49D70
测试 2 0x75816ca0 0x56CA0 0x75833130 0x73130 0x75809d70 0x49D70
测试 3 0x77a46ca0 0x56CA0 0x77a63130 0x73130 0x77a39d70 0x49D70
测试 4 0x77026ca0 0x56CA0 0x77043130 0x73130 0x77019d70 0x49D70
测试 5 0x75506ca0 0x56CA0 0x75523130 0x73130 0x754f9d70 0x49D70
测试 6 0x76d46ca0 0x56CA0 0x76d63130 0x73130 0x76d39d70 0x49D70
测试 7 0x75036ca0 0x56CA0 0x75053130 0x73130 0x75029d70 0x49D70
测试 8 0x758d6ca0 0x56CA0 0x758f3130 0x73130 0x758c9d70 0x49D70
测试 9 0x77296ca0 0x56CA0 0x772b3130 0x73130 0x77289d70 0x49D70
测试 10 0x77576ca0 0x56CA0 0x77593130 0x73130 0x77569d70 0x49D70

0x03 堆栈随机化

  • 程序启动时,系统会随机选择堆栈的基址,从而导致内存中各种变量地址发生改变(程序每次启动前)
  • 首先看一下如何开启程序的ASLR防护,这个貌似只有微软的编译器才有的功能,在VS编译器中新建一个项目(我的是 VS2017



  • 将随机基址改为是即可,那么怎么看一个可执行文件是否受到 ASLR 保护呢,可以用 PEview 这个工具看文件头中是否有 IMAGE_FILE_RELOCS_STRIPPED 这个标志,有表示没有受到 ASLR 保护,没有则表示收到了 ASLR 的保护
  • 这个是没有的
  • 这个是有的

  • 下面测试一下受到了 ASLR 保护的程序堆栈地址到底会不会变化,OD载入,到达程序的真正入口 OEP

  • 看一下此时堆栈地址

  • 之后重复 10 次,对比一下,可以看出入口堆栈地址防护较好,变化很大,随机性非常强
程序入口时的堆栈地址(有 ASLR) 程序入口时的堆栈地址(无 ASLR)
测试 1 0x00B7F76C 0x243FF24
测试 2 0x0137F750 0x243FF24
测试 3 0x00BDF7FC 0x243FF24
测试 4 0x00DAF8C0 0x243FF24
测试 5 0x0077F7B0 0x243FF24
测试 6 0x0057FC88 0x243FF24
测试 7 0x009FF834 0x243FF24
测试 8 0x012FF848 0x243FF24
测试 9 0x008FFA34 0x243FF24
测试 10 0x0075FDD0 0x243FF24

0x04 PEB\TEB随机化

  • 进程环境块(PEB)和线程环境块(TEB)随机化,在程序每次启动时(这个和编译时有没有加上 ASLR 防护没有关系,好像是系统默认的,加不加都会随机)
  • 利用 Windbg 查看 PEB 和 TEB 的地址(Windbg32Windbg64
  • 选择 File -> Open Executable,选择要查看的文件



  • 在最下面的命令行中输入 !peb 和 !teb 即可查询

  • 测试 5 次汇总一下,变化并不是很大
PEB地址 TEB地址
测试 1 0x00000000002FD000 0x00000000002FF000
测试 2 0x0000000000352000 0x0000000000354000
测试 3 0x000000000039A000 0x000000000039C000
测试 4 0x000000000038A000 0x000000000038C000
测试 5 0x0000000000302000 0x0000000000304000
  • 对于 ASLR 的全部测试到此结束

针对缓冲区保护技术(ASLR)的一次初探的更多相关文章

  1. 如何处理Android中的防缓冲区溢出技术

    [51CTO专稿]本文将具体介绍Android中的防缓冲区溢出技术的来龙去脉. 1.什么是ASLR? ASLR(Address space layout randomization)是一种针对缓冲区溢 ...

  2. [转] GCC 中的编译器堆栈保护技术

    以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...

  3. GCC 中的编译器堆栈保护技术

    GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...

  4. 大型.NET商业软件代码保护技术 技术与实践相结合保护辛苦创造的劳动成果

    列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...

  5. [破解] DRM-内容数据版权加密保护技术学习(上):视频文件打包实现

    1. DRM介绍: DRM,英文全称Digital Rights Management, 可以翻译为:内容数字版权加密保护技术. DRM技术的工作原理是,首先建立数字节目授权中心.编码压缩后的数字节目 ...

  6. 浅谈android代码保护技术_ 加固

    浅谈android代码保护技术_加固 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结果被人反编译了,那心情真心不舒服.虽然我们混淆,做到native层,但 ...

  7. 浅谈Android保护技术__代码混淆

    浅谈Android保护技术__代码混淆   代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元 ...

  8. 基于隐私保护技术的DNS通信协议介绍

    本文提出了一种基于用户数据报协议的DNS传输中用户隐私保护的加密方法:DNSDEA.该方法采用PKI加密体系与DNS协议相融合,不仅解决了域名隐私保护问题,而且与传统DNS体系相兼容,保持了DNS系统 ...

  9. 浅谈android代码保护技术_加固

    可看原文: http://www.cnblogs.com/jiaoxiake/p/6536824.html 导语 我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk,结 ...

随机推荐

  1. MySql数据库列表数据分页查询、全文检索API零代码实现

    数据条件查询和分页 前面文档主要介绍了元数据配置,包括表单定义和表关系管理,以及表单数据的录入,本文主要介绍数据查询和分页在crudapi中的实现. 概要 数据查询API 数据查询主要是指按照输入条件 ...

  2. JS的this指向深入

    this指向深入 this的绑定规则 默认绑定 this默认指向了window 全局环境下this指向了window 函数独立调用,函数内部的this也指向了window <script> ...

  3. JVM 中的垃圾回收

    说到JVM,总是绕不开垃圾回收,因为其是JVM的核心之一,因为对象的创建是非常频繁的,想要提高程序的执行效率,拥有一个高效的垃圾回收机制是必不可少的. 首先要明确,因为对象的创建只在堆中,所以垃圾回收 ...

  4. Hi3559AV100 NNIE开发(4)mobilefacenet.cfg参数配置挖坑解决与SVP_NNIE_Cnn实现分析

    前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...

  5. C指针与二维数组

    先贴上完整的代码: #include<stdio.h> int main(int argc, char *argv[]){ int a[3] [5]={1,2,3,4,5,6,7,8,9, ...

  6. 多种细分方式浏览销售数据,IAP助您有效洞察市场收益效果

    华为应用内支付服务是直接在应用程序内提供购买商品或订阅等功能,为了能够让开发者更好的了解应用内的销售额及商品购买.订阅的市场收益效果,华为应用内支付服务提供的消费数据统计和数据报表,支持多种细分方式浏 ...

  7. TextRank算法及生产文本摘要方法介绍

    TextRank 算法是一种用于文本的基于图的排序算法,其基本思想来源于谷歌的 PageRank算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之间的相似度作为边的权重,通过循环迭代 ...

  8. 【原创】Linux虚拟化KVM-Qemu分析(十一)之virtqueue

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...

  9. Python3基础之构建setup.py

    技术背景 在上一篇博客中,我们介绍了如何使用pyinstaller将python项目打包成一个可执行文件,并且放在系统目录下,让系统用户可以直接识别到我们构造的项目.而python项目中常见的setu ...

  10. iNeuOS工业互联平台,发布:消息管理、子用户权限管理、元件移动事件、联动控制和油表饼状图,v3.4版本

    目       录 1.      概述... 2 2.      平台演示... 2 3.      消息管理... 2 4.      子用户权限管理... 3 5.      元件移动事件... ...