##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下关闭ASLR(地址空间随机化)的方法相关推荐

  1. Linux下关闭和开启IPv6的方法

    确认IPV6是否开启 在Linux下确认IPv6是否已经被启用,可以从三个方面确定. 1.使用ifconfig查看自己的IP地址是否含有IPv6地址. eth0 Link encap:Ethernet ...

  2. 通过更改DllCharacteristics关闭ASLR地址空间随机化

    前言:在更改PE文件时,通过x32dbg调试发现imagebase并不是0x400000h,而是变化的值,于是了解到ASLR的概念 工具:010Editor.x64dbg.PE知识 步骤: 1,在PE ...

  3. [转]Linux下pppoe配合Drcom插件上网方法介绍......

    Linux下pppoe配合Drcom插件上网方法介绍 近几天在西邮bbs上闲逛,无意间注意到很多人纠结于同一个问题---linux上网,众所周知,linux系统在宿舍上网时比较烦人的一件事,虽然bbs ...

  4. linux redis php,Linux下编译redis和phpredis的方法

    这篇文章主要介绍了Linux下编译redis和phpredis的方法,分析了redis的下载,编译,安装及遇到的问题与相应的解决方法,需要的朋友可以参考下 本文讲述了Linux下编译redis和php ...

  5. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  6. Linux下最快速共享目录的方法

    Linux下最快速共享目录的方法 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 搭建FTP,或者是搭建网络文件系统,这 ...

  7. 批量修改linux服务器密码,Linux下批量修改服务器用户密码方法步骤

    Linux下批量修改服务器用户密码方法步骤 密码快要过期.由于机器数量众多,因此采用批量修改密码的方式来进行处理. 下面是具体步骤: 1.配置ssh免key # ssh-keygen -t rsa - ...

  8. Linux下分割与合并文件的方法

    Linux下分割与合并文件的方法 切割合并文件在linux下用split和cat就可以完成.下面举些实例进行说明. 1.文件切割 文件切割模式分为两种: 文本文件 二进制模式. 1.1文本模式 文本模 ...

  9. linux看php安装路径,linux下查找php安装路径的方法是什么

    linux下查找php安装路径的方法是什么 发布时间:2020-09-01 16:06:19 来源:亿速云 阅读:72 作者:小新 这篇文章主要介绍了linux下查找php安装路径的方法是什么,具有一 ...

最新文章

  1. GridView 实现LinkButton下载文件/附件
  2. android怎么判断程序进入了后台,Android检测应用程序是否进入后台
  3. 大学生推荐书籍阅读【开阔视野、境界提升】
  4. C++ Stacks(堆栈)
  5. 解决查询时报的cannot be cast to com.credithc.enjoy.manager.OrderResp错误
  6. 启动mq 在虚拟机中_记在使用rocketmq client客户端过程中踩到的坑
  7. BZOJ 4517 组合数+错排
  8. 今年新增院士中,最年轻的是他
  9. 高级软件工程第一次作业--准备
  10. amazeui学习笔记--css(常用组件5)--评论列表Comment
  11. MONO Jexus部署最佳体验
  12. 【网络信息安全】授权与访问控制
  13. mysql选择哪个隔离级别更好_深入理解Mysql的四种隔离级别
  14. vs2012生成的项目,如何在只装有VS2010的电脑上打开
  15. Python基础练习三超市存包柜模拟(优化)
  16. 【开发工具集】功能强大的网络设置工具——IPOP
  17. PyCharm(Python编译器汉化)
  18. 续上回 python 双色球 大乐透5注随机选号之排除历史开奖号码
  19. 以太网(报头格式 | MTU | ARP)
  20. 肥宅快乐还是不快乐,拓展欧几里得,exgcd???bfs

热门文章

  1. uel表达式 字符串截取_UEL表达式
  2. 关于C语言中的结构体所占的字节数 sizeof(struct)
  3. promise.catch和promise.then后的then是否会执行
  4. 合合信息受邀参与中国计算机学会计算机视觉专委会年度学术研讨会
  5. ABP+AdminLTE+Bootstrap Table权限管理系统第十一节--bootstrap table之用户管理列表
  6. WordPress 个人支付宝微信收款插件 WePay
  7. Linux redHat7.2配置yum源
  8. Office365 Exchange Hybrid No.23 共享日历
  9. html表格边框线透明度度标签,css如何让边框具有透明度
  10. 编译型语言与解释型语言的区别