1.一般栈溢出比堆溢出更容易利用,也更稳定
2.在决定动手写一个通用shellcode之前,最好先在各种windows版本下把漏洞分析一遍,包括win2k、xp、2003,各种语言版本,不同的sp版本可能漏洞症状也不同
3.不要试图在不同版本的windows里寻找不同跳转方式的相同地址,就是说,不要在win2ksp4简体中文版里的某个进程里搜索所有的jmp esp(ff,e4)的地址,在winxpsp1英文版里的某个进程里搜索所有的push esp,ret(54,c3)的地址,然后妄图比较出一个相同的地址。除非是加载在0x00400000位置的进程
4.如果用覆盖异常的方式接管指令,要注意到xp和2k是不同的。如果要写通用程序,最好用pop,pop,ret的方式,xp下不能用类似jmp ebx的方式。
5.如果要先搜索内存里的shellcode,先接管异常。xp不允许执行栈中的代码,所以需要在异常处理链里写入另一个跳转地址,再返回到栈中。或者之前就是通过覆盖异常的方式接管指令的话,现在可以直接利用了。
6.UNICODE编码比较麻烦,最好能绕过去。绕不过去时,XOR 99是个比较通用的方法
7.指令跳转只能依靠这几种指令:jmp,call,ret。绝大部分漏洞都只能尝试寻找这些指令地址
8.除了esp,ebx,还有其他方法可以定位shellcode,分析漏洞时,不妨把当时的所有寄存器都看一遍,有时保存在堆栈里的地址更有用。把上下文的调用函数也看一遍,利用它们定位可能效果更好
9.栈溢出时,如果能覆盖到ret但离溢出点太远且不能尽快跳过去,尝试覆盖异常,如果异常地址也很远不能覆盖到,试试其他方法(格式化字符串溢出?)或放弃
10.分析完一个漏洞后,写合适的shellcode往往是最难的,限制远比你想像的多,每个漏洞的利用都是耐心和创造力的考验