shellcode之踏雪无迹心得
总结来说就是 1保存所有寄存器的值 2堆栈平衡 3不破坏上层栈桢的数据
一般eax, ebx, ecx, edx的值都是无关要紧的。但不是绝对,要根据上下面决定。esi, edi, ebp, esp就一定要恢复执行shellcode之前的值了。
通用的办法是shellcode一开始就抬高栈顶,之后pushad,再运行shellcode。一开始就抬高栈顶的原因是防止shellcode被压栈的数据覆盖。
还有要注意的是如果push一些字符串数据供函数调用,API是不会帮你清栈的,这时栈就不平衡了,所以要自己动手来清栈,之后才能popad.... so...会增加shellcode的长度。一般的代码如下
xor ebx, ebx
mov bl, 020h ;这里假设字符串数据和hash之类的占用020h个字节
add esp, ebx
popad ;
xor ebx, ebx
mov bh, 040h ;
add esp, ebx
其它问题都解决了,还有一个麻烦的问题~~
返回到哪里?
如果发生溢出的函数只被一个地方调用问题很好办,但如果被多个函数调用的话。。。
当然可以通过逆向工程解决这个问题~~
还有返回地址位于exe上只要硬编码就万事无忧,但如果是DLL的话只好返回其基址,再加上RVA,PUSH其VA再RET了。。。
踏雪无迹只是理想境界,当缓冲区太小,不得不大面积覆盖上面函数的栈桢的时候,还是直接了当的ExitProcess吧。。。
阅读(1460) | 评论(0) | 转发(0) |