内存安全之defense之alsr

ASLR(address space layout randomization)
ASLR做的事情是什么呢?
它的目的是打乱地址空间,让攻击者们找不到敏感的信息的地址。不过很遗憾,它并不是完全随机化的,所以总是有规律可循的。
其实,这种防御的想法是相当朴素的。
说实话,是那种让人沮丧的朴素。
老实说,工程的思想总是让人提不起劲儿来。是有些见招拆招的巧,但总透着点一叶障目的蠢。
现在时兴的方法是把一些秘密区域藏在一大片地址空间里。比如代码指针。包括,CPI实现的一个方式就是,把所有的相关指针放到一个shadow area里面,然后当要调用的时候就去那里去取,当然设计的时候自然默认shadow area是完全的,其实当然是不安全的。
我其实一直想知道,除了缓存区溢出以外,还有什么可以攻击的方法。在内存攻击里面。
对了,plt表和got表和aslr的实现没什么联系,不过aslr之后会把相应的地址放到got表里。
我觉得做安全一个好处是,如果你真的苛求安全的话,你就得深入到所有领域,你就得了解所有的东西。缺点就是,你从一开始,你的视角就限定死了。不过,这个东西打开并不难,如果你不是一个惰性的人(这好像一句废话,人都是惰性的),当你想知道一些东西的时候,如果你查找的东西或者你思索的东西给了你答案了,你能不能多想想答案以外的事情。
对了,ASLR是操作系统层面上的事情。
下面讲一下linux的ASLR 的实现。
下面是同一段程序的开不开地址随机化的两张截图。
不开的
开了的
注意在linux中用gdb调试程序的时候是默认关闭地址随机化 的,所以在开始调试的时候要set disable-randomization off。
好了,我们来观察这两张图。
总共分为四部分:
第一部分就是code的映射,这个是固定的不随机化的。
第二部分是heap是单独随机化的
第三部分是从mpx的mmap部分,这里面包括链接库。
第四部分是stack以及后面的vvar和vdso这部分是另外随机化的。
最后一部分可有可无是vsyscall。
每一部分的随机化方式如下。
heap:[old_start_brk, old_start_brk+0x02000000)中页面对齐的值。
mmap:page_align(0x7ffbf8000000-rand),而其中的rand在是28比特的数字左移12位。
stack:page_align(0x00007ffffffff000L-rand)。
这里再讲一下vsdo,vvar和vsyscall,这三个部分都是为了系统调用服务的。众所周知,系统调用需要进行内核切换,这是很费功夫的一件事,所以就把一些系统调用映射到了user区域,通过vsdo或者vsyscall调用他们,但是vsyscall是静态的且只能装四个,所以有vsdo的情况下是不用vsyscall的。而vsdo是动态的。vvar是vsdo那些系统调用的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值