转移自之前的博客
shellcode布置
将shellcode放在缓冲区中(静态地址),即函数返回地址之前。//shellcode自身可能会被压栈数据破坏,难以动态定位
使用jmp esp/call esp 指令作为跳板指令,定位shellcode,使shellcode正好布置在返回地址之后。//前栈帧数据被大范围破坏
为尽量避免1,2的缺点,可以使用跳转指令定位shellcode,同时将shellcode布置在缓冲区内。
为了使shellcode具有通用性/安全性,通常会在shellcode一开始大范围抬高栈顶,保护自身代码的完整性。
某些情况下不允许使用跳板指令,静态地址又不够准确。可以淹没大片内存的情况下,将shellcode布置在一大段nop之后。此时定位shellcode时,只要能够跳进一大片nop之中即可。
返回地址距离缓冲区偏移量不确定。若函数返回地址按双字节不定,可以用一片连续的跳转指令的地址来覆盖函数返回地址,只要有其中一个可以成功覆盖,shellcode就能执行。(待理解)
按字节错位引起定位失败从而使shellcode无效。使用按字节相同的双字跳转地址,甚至使用堆中的地址,将shellcode用堆扩展的方法放置在相应区域(Heap spray)。(待理解)
shellcode的编码技术
- 原因:
所有的字符串函数都会对NULL字节进行限制,通常需要在shellcode中选择特殊的指令避免直接出现NULL字节或字。
有些函数还会要求shellcode必须为可见字符的ASCII值或Unicode值。
基于特征的IDS系统往往会对常见的shellcode进行拦截。
解决:
编码。先编码使内容达到限制的要求,再构造解码程序放在shellcode开始执行的地方。