精华内容
下载资源
问答
  • 内存地址随机化
    千次阅读
    2017-03-09 16:28:26

         与位置无关码即每次运行地址不一样,分为两种,一种是动态连接库,一种是与位置无关的应用程序。如果程序每次运行内存地址不一样,那么就能提升一定的安全性。

    1. 动态库

        在编译的时候加上-PIC选项即可。

    2. 应用程序

        在编译的时候增加 -fPIE和-pie选项。其中-fPIE用于编译器,-pie用于连接器。

    3. 注意事项

    (1)某些版本较低的编译器不支持pie选项。

    (2)如果支持,实验方法是编译后的应用程序运行后,使用/proc/[pid]/maps查看内存地址分布情况。然后重新启动应用程序,再次使用/proc/[pid]/maps命令查看内存地址分布情             况,然后比较这两次地址,看应用程序代码段地址是否一样,如果不一样,表面pie选项起作用了。

    (3)只编译(预处理、编译、汇编)不连接,加-c -o选项。

    (4)file命令查看elf格式文件,如果是shared object,那么表示此程序支持PIE与位置无关;如果是executable表示编译和连接分别
              没有加-fPIE和-pie选项。

    (5)cat /proc/pid/maps可以查看进程映射的内存区域和访问权限等信息,如果每次只需应用程序内存区域地址都是变化的,那么说明
              此应用程序在编译和连接时分别加了-fPIE和-pie选项。

    (6)CFLAGS   表示用于 C 编译器的选项 ,如指定头文件(.h文件)的路径等
              CXXFLAGS 表示用于 C++ 编译器的选项。
              LDFLAGS  表示用于连接的选项,比如gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。
              LIBS:   告诉链接器要链接哪些库文件。

    (7)cat /proc/sys/kernel/randomize_va_space的值含义和设置:
             0 - 表示关闭进程地址空间随机化。
    1 - 表示将mmap的基址,stack和vdso页面随机化。
    2 - 表示在1的基础上增加栈(heap)的随机化。
             可这样设置这个值:  echo 1 >  /proc/sys/kernel/randomize_va_space


    更多相关内容
  • 学过编译原理可知,C语言程序中所有变量的逻辑地址编译后都是确定了的,但是在linux平台上实际使用中可以发现变量的地址不是固定的,如下: * 示例代码 #include <stdio.h> int main(){ int a; printf(...

    说明

    • 学过编译原理可知,C语言程序中所有变量的内存地址编译后都是确定了的,但是在linux平台上实际使用时可以发现变量的内存地址并不是固定的,如下:
    * 示例代码
    #include <stdio.h>
    
    int main(){
        int a;
        
        printf("%p\n", &a);
        return 0;
    }
    * 运行结果
    xxx@Lenovo-V110-15IKB:~/$ ./test
    0x7ffdd2ec0124
    xxx@Lenovo-V110-15IKB:~/$ ./test
    0x7ffc577a9644
    xxx@Lenovo-V110-15IKB:~/$ ./test
    0x7fffef5827e4
    xxx@Lenovo-V110-15IKB:~/$ ./test
    0x7fff44595414
    xxx@Lenovo-V110-15IKB:~/$ ./test
    0x7fffe93e1964
    

    理解

    • 程序都是在运行阶段分配内存,所有变量的逻辑地址都是在编译后就确定了,但都是相对的偏移地址,只不过全局变量是相对数据段的偏移,局部变量是相对程序栈顶的偏移。
    • 变量地址会发生变化是因为ASLR机制导致了内存段地址发生了变化。

    ASLR

    • 地址空间布局随机化(ASLR)可以帮助克服某些类型的缓冲区溢出攻击,ASLR可以将基数,库,堆和堆栈放在进程地址空间中的任意随机位置,这使攻击程序很难预测下一条指令的内存地址。
    • ASLR内置在Linux内核中,并由参数控制 /proc/sys/kernel/randomize_va_space,该 randomize_va_space参数可以采用以下值:
    0 : 禁用ASLR。如果使用norandmapsboot参数引导内核,则将应用此设置。
    1 : 随机化堆栈,虚拟动态共享对象(VDSO)页面和共享内存区域的位置。数据段的基地址位于可执行代码段的结尾之后。
    2 : 随机化堆栈,VDSO页,共享内存区域和数据段的位置。这是默认设置。
    
    • 设置
    echo 0 > /proc/sys/kernel/randomize_va_space
    * 注意:非root用户如下设置会报错
    sudo echo 0 > /proc/sys/kernel/randomize_va_space
    bash: /proc/sys/kernel/randomize_va_space: Permission denied
    * 因为这样写系统会认为是sudo 命令重定向,而sudo命令不支持重定向,正确写法: 
    sudo sh -c "echo 0 > /proc/sys/kernel/randomize_va_space"
    
    • 关闭ASLR后,测试发现变量的地址就是固定的。
    展开全文
  • KASLRfinder摘要:KASLRfinder是一个小型实用程序,可用于查找Windows 10内核及其驱动程序在内存中的加载位置-尽管地址已通过内核地址空间布局随机化进行了随机化(KASLRfinder摘要:KASLRfinder是一个小型实用程序...
  • windows内存保护机制之地址空间分配随机化技术
  • 关闭Linux 内存地址随机化机制

    万次阅读 2012-09-27 13:02:10
    关闭Linux 内存地址随机化机制, 禁用进程地址空间随机化.可以将进程的mmap的基址,stack和vdso页面地址固定下来. 可以通过设置kernel.randomize_va_space内核参数来设置内存地址随机化的行为. 目前randomize_va_...
    关闭Linux 内存地址随机化机制, 禁用进程地址空间随机化.可以将进程的mmap的基址,stack和vdso页面地址固定下来. 可以通过设置kernel.randomize_va_space内核参数来设置内存地址随机化的行为.

    目前randomize_va_space的值有三种,分别是[0,1,2]

    0 - 表示关闭进程地址空间随机化。
    1 - 表示将mmap的基址,stack和vdso页面随机化。
    2 - 表示在1的基础上增加栈(heap)的随机化。


     # echo 0 >/proc/sys/kernel/randomize_va_space 


    通过用下面这个程序,可以检查是否修改成功(x86_64):
    // gcc -g stack.c -o stack
    //
    unsigned long sp(void){ asm("mov %rsp, %rax");}
    int main(int argc, char **argv)
    {
        unsigned long esp = sp();
        printf("Stack pointer (ESP : 0x%lx)\n",esp);
        return 0;
    }
    


    关闭前运行结果

    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fff50162e50)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fff5d023730)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7ffff9982180)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffb23612a0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7ffffd5a4980)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffbac61bf0)

    关闭后运行结果
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    -bash-4.1# ./stack
    Stack pointer (ESP : 0x7fffffffeaf0)
    

    参考:
    http://en.wikipedia.org/wiki/Address_space_layout_randomization
    http://xorl.wordpress.com/2011/01/16/linux-kernel-aslr-implementation/
    展开全文
  • Linux下关闭ASLR(地址空间随机化)的方法

    万次阅读 多人点赞 2018-08-14 15:12:29
    0x00 背景知识 ...随着内存地址随机化,使得响应的应用变得随机。这意味着同一应用多次执行所使用内存空间完全不同,也意味着简单的缓冲区溢出攻击无法达到目的。 GDB从版本7开始,第一次在Ubuntu ......

    ##0x00 背景知识
    ASLR(Address Space Layout Randomization)在2005年被引入到Linux的内核 kernel 2.6.12 中,当然早在2004年就以patch的形式被引入。随着内存地址的随机化,使得响应的应用变得随机。这意味着同一应用多次执行所使用内存空间完全不同,也意味着简单的缓冲区溢出攻击无法达到目的。

    GDB从版本7开始,第一次在Ubuntu 9.10(Karmic)上,被调试的程序可以被关闭ASLR(通过标记位ADDR_NO_RANDOMIZE )。

    此处有坑,笔者有一个Ubuntu 9.10的虚拟机,用了下面将要介绍的全部姿势,死活关闭不了ASLR,后来换成Ubuntu 10.04就没问题了,说明Ubuntu 9.10的版本控制ASLR的方法还不成熟,需要重源码层面确认是否可以关闭开启,真是坑到家了。

    0x01 查看ASLR设置

    查看当前操作系统的ASLR配置情况,两种命令任你选择

    $ cat /proc/sys/kernel/randomize_va_space
    2
    $ sysctl -a --pattern randomize
    kernel.randomize_va_space = 2
    

    0x02 配置选项

    • 0 = 关闭
    • 1 = 半随机。共享库、栈、mmap() 以及 VDSO 将被随机化。(留坑,PIE会影响heap的随机化。。)
    • 2 = 全随机。除了1中所述,还有heap。

    后面会详细介绍ASLR的组成,不关心的同学可以简单理解为ASLR不是一个笼统的概念,而是要按模块单独实现的。当然,在攻防对抗的角度上,应为不是所有组件都会随机,所以我们就可以按图索骥,写出通用的shellcode调用系统库。

    0x03 查看地址空间随机效果

    使用ldd命令就可以观察到程序所依赖动态加载模块的地址空间,如下下图所示,被括号包裹。在shell中,运行两次相同的ldd命令,即可对比出前后地址的不同之处,当然,ASLR开启时才会变化:

    ASLR开启时,动态库的加载地址不同

    这里写图片描述

    ASLR关闭时,动态库的加载地址相同
    这里写图片描述

    0x04 关闭ASLR

    方法一: 手动修改randomize_va_space文件

    诚如上面介绍的randomize_va_space文件的枚举值含义,设置的值不同,linux内核加载程序的地址空间的策略就会不同。比较简单明了。这里0代表关闭ASLR。

    # echo 0 > /proc/sys/kernel/randomize_va_space
    

    注意,这里是先进root权限,后执行。不要问为什么sudo echo 0 > /proc/sys/kernel/randomize_va_space为什么会报错

    方法二: 使用sysctl控制ASLR

    $ sysctl -w kernel.randomize_va_space=0
    

    这是一种临时改变随机策略的方法,重启之后将恢复默认。如果需要永久保存配置,需要在配置文件 /etc/sysctl.conf 中增加这个选项。

    方法三: 使用setarch控制单个程序的随机化

    如果你想历史关闭单个程序的ASLR,使用setarch是很好的选择。setarch命令如其名,改变程序的运行架构环境,并可以自定义环境flag。

    setarch `uname -m` -R ./your_program
    

    -R参数代表关闭地址空间随机化(开启ADDR_NO_RANDOMIZE)

    方法四: 在GDB场景下,使用set disable-randomization off

    在调试特定程序时,可以通过set disable-randomization命令开启或者关闭地址空间随机化。默认是关闭随机化的,也就是on状态。

    当然,这里开启,关闭和查看的方法看起来就比较正规了。

    关闭ASLR:
    set disable-randomization on
    开启ASLR:
    set disable-randomization off
    查看ASLR状态:
    show disable-randomization

    0x05 ASLR与PIE的区别

    ASLR有一个模糊的值(1),既不是全开启也不是全关闭,而是部分关闭,那这部分到底是什么,很容易产生歧义。

    ASLR 不负责代码段以及数据段的随机化工作,这项工作由 PIE 负责。但是只有在开启 ASLR 之后,PIE 才会生效。

    0x06 一些没有用的感想

    写这篇文章的原点是在调试一个简单的ROP利用没有成功弹shell,但是出了一些莫名其妙的sh报错。冥冥中感觉里成功不远了。随着翻阅资料的积累,和相关writeup的release date接近2018年,越来越坚定了这份信心。终于找到了ASLR的影响导致ROP不成功的原因。

    最近工作也很累,不是量大,而是心累。希望LP越来越漂亮,越来越美丽~

    这里写图片描述

    0x07 参考文献

    这个不能忘,都是宝贵的经验。

    https://linux-audit.com/linux-aslr-and-kernelrandomize_va_space-setting/
    https://www.theurbanpenguin.com/aslr-address-space-layout-randomization/
    https://stackoverflow.com/questions/5194666/disable-randomization-of-memory-addresses
    http://visualgdb.com/gdbreference/commands/set_disable-randomization
    https://wiki.ubuntu.com/Security/Features
    https://outflux.net/blog/archives/2010/07/03/gdb-turns-off-aslr/comment-page-1/

    展开全文
  • linux内核地址随机化-kaslr

    千次阅读 2020-02-27 18:50:03
    未开启内核地址随机化 Virtual kernel memory layout: modules:0xffffff8000000000 - 0xffffff8008000000 (128MB) vmalloc: 0xffffff8008000000 - 0xffffffbebfff0000 (250GB) .text: 0xffffff8008080000 - 0...
  • 文章目录Windows安全机制地址随机化:ASLR机制原理映像随机化堆栈随机化PEB与TEB随机化绕过攻击未启用ASLR的模块利用部分覆盖进行定位内存地址利用Heap spray进行内存地址定位利用Java applet heap spray定位内存...
  • 阿里聚漏洞扫描器有一个检测项叫未使用地址空间随机化技术, 本文主要介绍该项技术的原理和扫描器的检测方法。
  • 一. 内存 简介 ...(1) SDRAM 简介 ( 动态随机访问存储器 | 同步时钟 | 动态刷新 | 随机访问 ) (2) DDR 和 DDR2 ( DDR 是 SDRAM 传输速率的 2 倍 | DDR2 是 DDR 传输速率的 2 倍 ) 3. 内存的内部
  • 5.利用部分覆盖进行定位内存地址 映像随机化只是对映像加载基址的强两个字节做随机化处理,我们可以选择覆盖这个地址的 最后一个字节;此外,ASLR 只是随机化了映像的加载基址,而没有对指令序列进行随机化, 也...
  • 出发点常规的缓冲区溢出利用技术以及其衍生的Ret2libs和ROP利用技术在利用栈缓冲区溢出漏洞进行攻击时,需要事先熟悉被攻击进程的虚拟地址空间布局以便采用硬编码方式布局栈内存。由于操作系统每次加载进程和动态...
  • 样本的选择有随机抽样、系统抽样、分层抽样、等距抽样、多级抽样和()等。足球比赛中,进攻战术有个人、局部与整体之分,其中个人进攻战术包括( )。授权访问信息资产的责任人应该是()磨粒代号TP表示()。现代信息存储...
  • 【4】快排及随机化算法

    千次阅读 2018-10-02 15:32:10
    随机化快速排序随机选取主元素也能达到这种效果且 无需对分布做任何假设(没有一种分布会引起最差的结果) 分析(数学高能预警) 令 T ( n ) T(n) T ( n ) 为运行时间的随机变量,假设随机数(主元素)是独立的...
  • 保存在data,rodata等分区的变量,内存地址在编译期就能确定,通过变量名的访问可以由在编译期将变量名映射为变量的内存地址来实现;但是局部变量和指针变量不同,其内存地址是不断变化的,每次执行都不同。 事实上...
  • 进程地址空间(虚拟地址 | 物理内存

    千次阅读 多人点赞 2021-03-17 20:45:37
    文章目录前言一、简单理解地址空间二、虚拟地址现象解释三、三个问题搞懂地址空间1. 什么是地址空间?2. 为什么要有地址空间?3. 地址空间是如何工作的?四、一些补充 前言 在之前的学习中,我们只学习了图中的下...
  • 针对当前软件保护技术存在的不足,提出一种代码碎片化技术,该技术是一种以函数为单元,对函数进行代码shell化、内存布局随机化、执行动态链接化的新型软件保护技术,代码shell化实现代码碎片的位置无关变形,内存...
  • Redis中内存溢出问题和持久方法

    千次阅读 2019-09-20 10:25:47
    一、内存溢出问题 解决办法 1. 设置key的过期时间 2. 按需求使用8种数据淘汰策略 volatile-lru(Least Recently Used):从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 volatile-lfu(Least Frequently...
  • 内存数据库究竟是如何发挥内存优势的?

    万次阅读 多人点赞 2022-05-09 12:55:57
    内存数据库?
  • 内存的初始

    千次阅读 2017-03-29 10:23:13
    内存的初始
  • 内存越界一定会导致程序崩溃吗?详解内存越界

    千次阅读 多人点赞 2022-08-20 17:59:23
    本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。
  • Address space layout randomization:地址空间布局随机化,是参与保护缓冲区溢出问题的一个计算机安全技术。是为了防止攻击者在内存中能够可靠地对跳转到特定利用函数。ASLR包括随机排列程序的关键数据区域的位置,...
  • 【云原生】内存数据库如何发挥内存优势

    万次阅读 多人点赞 2022-07-06 09:37:45
    与以磁盘存储为主的普通数据库相比,内存数据库的数据访问速度可以高出几个数量级,能大幅提高运算性能,更适合高并发、低延时的业务场景。不过,当前大部分内存数据库仍然...我们知道,内存可以通过地址(指针)来访问
  • iOS之深入解析文件内存映射MMAP

    万次阅读 热门讨论 2021-08-31 19:33:16
    一、常规文件操作 常规文件操作(read/write)有以下重要...如果不存在,则通过 inode 定位到文件磁盘地址,将数据从磁盘复制到内核页高速缓冲,之后再次发起读页面过程,进而将内核页高速缓冲中的数据发给用户进程。
  • ![图片说明](https://img-ask.csdn.net/upload/201803/05/1520222472_652631.png)!...虚拟机分陪了4G,主机内存大小128G,总35主机,运行状态1台,对于内存,不应该是关机后不是应该释放了么?求解答
  • 内存地址空间布局

    万次阅读 2014-12-04 11:58:18
    在32位模式下虚拟地址空间总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址...
  • Windows内存保护机制及绕过方法

    千次阅读 2019-10-27 22:31:58
    地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策——GS编译保护技术。 GS编译保护技术是通过编译时添加相关代码而实现的,开启GS 编译选项后会在函数的开头...
  • CPU数据总线和地址总线 内存和外存

    千次阅读 2021-04-07 12:01:47
    (即通过地址总线确定要访问的内存地址,再由数据总线传输数据) 从开发者角度来说,数据总线长度应该和地址总线宽度一致,也就是一个指针和一个整数宽度相等,但是从硬件角度来讲,有些不切实际,比如说8位的CPU,...
  • 持久内存(PMem)科普

    千次阅读 2021-06-16 16:25:48
    你说不定在不同的渠道已经听说过一些类似的让人一头雾水的技术名词,比如非易失性存储,持久内存,傲腾持久内存,甚至英文的名词Optane SSD, Optane persistent memory, PMem, DCPMM, AEP等等…… 这些名词到底是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 358,967
精华内容 143,586
关键字:

内存地址随机化

友情链接: I2SBUS.zip