该用户从未签到
|
嘛,都在学习java,本着第一次发帖一定要够闲的原则,我来发点基础的二进制漏洞相关
本人也是刚接触不久,所以也不整什么高深的了,就基础来说一点
首先就栈结构说一点,栈结构比较简单,至于堆结构以后有机会再讲吧,太复杂了,估计没几个人能真正搞懂
首先,栈是从高地址向低地址扩散的,溢出攻击正是利用格式化字符会移动到下一个地址位的特性,不断往下移动栈指针,从而找到需要修改的值所在的地址
利用如%n这种可以修改数据的格式化字符,通过对16进制地址进行10进制转化然后通过%n控制转化后的宽度,从而修改数据(改变其中存储的地址)
值传递对于被压栈的参数来说,是直接放在已压栈的参数中的
指针传递对于被压栈的参数来说,是将指针储存的地址存放到已压栈的参数中
那么压栈的顺序是什么样的呢
首先在调用参数时,会将参数按照从后至前(大部分编译器)的顺序push到栈中
接着会压入返回地址,比较新的系统会压入一些额外的数据,在此不做讨论,这个返回地址是什么呢,就是在cell的方法之下的那一条指令的地址,等此方法执行外后会接着回来执行下面的指令,靠的就是这个返回地址,这是重点,因为我们通常要实现漏洞定位到hacker们要自定义的新指令,所要"没过"的就是这个返回地址,通过刷入新地址替代返回地址,从而在方法执行完毕后使计算机自动去跳到恶意代码执行
然后就是压入ebp,在被没过后通常造成栈帧失衡而报错
最后就是方法内的局部变量,顺序是从上到下
举例:
输入最下方的字符串后,当使用printf时,因为只有一个参数,而其中又有数个格式化字符,这时,栈指针不断下移,直到所有格式化字符都被输出完毕,这就有可能从printf的栈下移到main的栈,从来读取甚至修改main中的变量
以上为另一个例子,对具体移动方式的补充说明
函数入栈:
从参数入栈到调用者返回地址入栈都属于调用者栈帧范围,一说ebp入栈也属于调用者范围,个人觉得返回地址入栈更合适
返回地址存储的是下一条指令执行的地址,而非返回值地址
调用者ebp入栈开始才是被调用者的栈帧范围,因为要使用该区域为被调用者的栈底
特别注意:数组会在栈区开一块对应长度的连续内存空间,首地址却是低地址端,因为数组是增加地址遍历,此条根据vc++编译器测试得出
以上都是我过去写的东西,回头看了下基本没错误,属于基础中的基础
其实并没有讲二进制漏洞,而是主讲了下栈溢出漏洞的原理,讲的太琐碎了,以后有机会有人想看的话我就整理一下,也不知道这有没有同样对安全技术感兴趣的人,一个人学真是太寂寞了!
|
|