风意水无痕 发表于 2017-8-16 16:50

二进制漏洞,娱乐贴

嘛,都在学习java,本着第一次发帖一定要够闲的原则,我来发点基础的二进制漏洞相关

本人也是刚接触不久,所以也不整什么高深的了,就基础来说一点
首先就栈结构说一点,栈结构比较简单,至于堆结构以后有机会再讲吧,太复杂了,估计没几个人能真正搞懂

首先,栈是从高地址向低地址扩散的,溢出攻击正是利用格式化字符会移动到下一个地址位的特性,不断往下移动栈指针,从而找到需要修改的值所在的地址

    利用如%n这种可以修改数据的格式化字符,通过对16进制地址进行10进制转化然后通过%n控制转化后的宽度,从而修改数据(改变其中存储的地址)

    值传递对于被压栈的参数来说,是直接放在已压栈的参数中的
    指针传递对于被压栈的参数来说,是将指针储存的地址存放到已压栈的参数中


    那么压栈的顺序是什么样的呢
    首先在调用参数时,会将参数按照从后至前(大部分编译器)的顺序push到栈中
    接着会压入返回地址,比较新的系统会压入一些额外的数据,在此不做讨论,这个返回地址是什么呢,就是在cell的方法之下的那一条指令的地址,等此方法执行外后会接着回来执行下面的指令,靠的就是这个返回地址,这是重点,因为我们通常要实现漏洞定位到hacker们要自定义的新指令,所要"没过"的就是这个返回地址,通过刷入新地址替代返回地址,从而在方法执行完毕后使计算机自动去跳到恶意代码执行
    然后就是压入ebp,在被没过后通常造成栈帧失衡而报错
    最后就是方法内的局部变量,顺序是从上到下

举例:
http://r.photo.store.qq.com/psb?/V135R4L807pYw6/gDGN.j8X6j4XWFSrxz6UB48ODsftGGxMpw.CMr6fOEY!/o/dB8BAAAAAAAA&ek=1&kp=1&pt=0&bo=CwOQAQsDkAEDACU!&su=0189686945&tm=1502870400&sce=0-12-12&rf=2-9

输入最下方的字符串后,当使用printf时,因为只有一个参数,而其中又有数个格式化字符,这时,栈指针不断下移,直到所有格式化字符都被输出完毕,这就有可能从printf的栈下移到main的栈,从来读取甚至修改main中的变量

http://r.photo.store.qq.com/psb?/V135R4L807pYw6/ZgsOLhmHw5cDZbYGZgTZHGAdYdYvOaCpwJmV.t3ETr4!/o/dCABAAAAAAAA&ek=1&kp=1&pt=0&bo=ZgIlAmYCJQIDACU!&su=08218913&tm=1502870400&sce=0-12-12&rf=2-9

以上为另一个例子,对具体移动方式的补充说明

函数入栈:
http://r.photo.store.qq.com/psb?/V135R4L807pYw6/qr7FccgzFWL98coN4mgolQZF2hoooYvR.GIk8zlazOI!/o/dCABAAAAAAAA&ek=1&kp=1&pt=0&bo=zgEGAc4BBgEDACU!&su=0210767041&tm=1502870400&sce=0-12-12&rf=2-9

从参数入栈到调用者返回地址入栈都属于调用者栈帧范围,一说ebp入栈也属于调用者范围,个人觉得返回地址入栈更合适

返回地址存储的是下一条指令执行的地址,而非返回值地址

调用者ebp入栈开始才是被调用者的栈帧范围,因为要使用该区域为被调用者的栈底

特别注意:数组会在栈区开一块对应长度的连续内存空间,首地址却是低地址端,因为数组是增加地址遍历,此条根据vc++编译器测试得出



以上都是我过去写的东西,回头看了下基本没错误,属于基础中的基础


其实并没有讲二进制漏洞,而是主讲了下栈溢出漏洞的原理,讲的太琐碎了,以后有机会有人想看的话我就整理一下,也不知道这有没有同样对安全技术感兴趣的人,一个人学真是太寂寞了!

admin 发表于 2017-8-16 18:00

水贴 坚挺 完毕~~~~~~~~

风意水无痕 发表于 2017-8-17 11:07

admin 发表于 2017-8-16 18:00
水贴 坚挺 完毕~~~~~~~~

不水我能放到娱乐版块么{:3_47:}

小蝶 发表于 2017-8-17 20:05

你个 逗比~~~~~~~~~~

风意水无痕 发表于 2017-8-18 11:03

小蝶 发表于 2017-8-17 20:05
你个 逗比~~~~~~~~~~

who are you:$

Song109 发表于 2018-6-11 16:51

水贴也看不懂。。。
页: [1]
查看完整版本: 二进制漏洞,娱乐贴