attacklab笔记

做完attacklab记点什么,防止以后什么都不记得了。

phase1-3用getbuf读取字符串,但不检测栈溢出,正常的gets()在返回前会call一个check函数,检查栈溢出。

在lab里通过栈溢出顶掉返回地址,把返回地址变成栈的地址,inject代码到getbuf的栈里或到上层的栈里。在这个过程中明显感受到代码和栈和数据都是在一个地址空间里。

phase4-5中增加了两种防止栈溢出的机制:1.栈随机化:每一次栈的地址都不一样(在地址空间里),没有办法把返回地址设置到栈上;2.把属于栈的地址设为不可执行的。

这样使用叫做return-oriented programming (ROP)的机制进行攻击。栈溢出把返回地址设置成原本代码的地址,并进行截断,生成想要的指令,并且马上接ret,pc转换为下一个栈上的指令地址。这一小段代码叫做gadget。这个过程中需要与汇编指令表相互对照,现有思路,再去找指令。

整个过程中还有两点值得记录:1.最开始遇到一个问题,设置返回地址后,不能继续覆盖栈上的值了,会出现segmentfault,只能把代码放在当前的栈帧中。后来发现返回地址只设置成了四字节,后四字节是00000000,如果覆盖掉了pc会指向无效地址。x86-64上地址都应该是8字节64位的。2.打出的代码之类的要把这些字符转换成二进制的信息,这些信息本身就是代码,它们对应出的ascii不一定会是什么,转换后要把这些信息传递到程序中。

猜你喜欢

转载自blog.csdn.net/bysoulwarden/article/details/80315057