- 论坛徽章:
- 1
|
jianus 发表于 2012-04-08 14:24
单方向的?我看不出来单方向的,后面的踩不到,那么前面的可以踩,只需要一个踩到就可以了,或者只需稍微偏移一下地址就可以改了。否则这个栈只能放到边边上去了,那么岂不是直接告诉别人那个栈在哪里,过去改了就行了。另外栈如果要添加的话,对于linux而言,只能够添加到更小的地址里面去了,因为现在栈就是摆在离内核最近的低于3G的内存空间里面去了。添加到低地址的内存那边?那就更糟了,那边除了程序的数据段和代码段,就是malloc的空间,那么随便一个写越界,什么都玩完了。反正这栈不能放到代码段里面,这里面的数据就别指望能够写的,那么放到数据段?那就更好改了。
关于单方向, 举个例子:
现在的堆栈:
高位地址
...
返回地址
局部变量char *s[10]
局部变量int a
...
低位地址
向s copy 20个字节, 使s溢出, 覆盖"返回地址". 但a是不会被覆盖的.
攻击者可以任意构造数据, 再利用了原有代码没有检查长度的漏洞. 但不是能够直接操作指针.
新的内存分布:
把原来堆栈往高位挪一些, 腾出写地方放新的代码栈就可以了.
高位地址
...
堆
数据栈
代码栈
...
低位地址
|
|