注:学习笔记来自安全牛课堂。感谢倪群主,感谢苑老师!
ESP的地址是会随机变化的,因此如果按照原来的思路:
测试溢出发送的字符数(大概)----利用唯一字符法测试准确值----再次验证准确值-----修改EIP数据为ESP地址----将shell脚本溢出写入ESP中
这么一个思路来看的话,看起来是对的。实际上由于ESP地址会跟着系统重启而变更,从而无法实现。
因此,思路是这样的,先在EIP中存入到内存中的某个固定地址,这个地址里面存放的是JMP ESP命令,这个指令的意思是跳到ESP内存地址。这样的话,只要ESP中存了shell,那么就可以执行!
补充,后面一列OS那里,必须要选择都是true的,表示每个系统都带的模块,而不是说有的系统带,有的系统不带。false就表示不带。
遗憾的是,第一次找,没找到,说明上面找的那个模块里面没有JMP ESP 指令。如下图:
另外,还有一种可能,就是都模块中都找不到。。。。
当找到后,双击里面一行,进入查看
由于测试的目标没有内存保护机制,所以之前在选存储JMP ESP指令的内存地址的时候,可以随便选,如下图:之前就是在这选内存地址的
但是,若想绕过DEP和那个ASR内存保护机制,那么就不能随便选一个JMP ESP的内存地址了。下面是绕过DEP的方法:
然后还是回到选择JMP ESP模块那里,上面只是看一看,方便后期绕过。下面是进行断点调试,让程序一运行到那个JMP ESP位置就暂停
上面做那么多事,就是为了后面用脚本发送数据,看运行到这个位置的时候,能否发生跳转。