转移自之前的博客

shellcode布置

  1. 将shellcode放在缓冲区中(静态地址),即函数返回地址之前。//shellcode自身可能会被压栈数据破坏,难以动态定位

    1

    1

  2. 使用jmp esp/call esp 指令作为跳板指令,定位shellcode,使shellcode正好布置在返回地址之后。//前栈帧数据被大范围破坏

    2

    2

  3. 为尽量避免1,2的缺点,可以使用跳转指令定位shellcode,同时将shellcode布置在缓冲区内。

    3

    3

  4. 为了使shellcode具有通用性/安全性,通常会在shellcode一开始大范围抬高栈顶,保护自身代码的完整性。

    2

    2

  5. 某些情况下不允许使用跳板指令,静态地址又不够准确。可以淹没大片内存的情况下,将shellcode布置在一大段nop之后。此时定位shellcode时,只要能够跳进一大片nop之中即可。

    2

    2

  6. 返回地址距离缓冲区偏移量不确定。若函数返回地址按双字节不定,可以用一片连续的跳转指令的地址来覆盖函数返回地址,只要有其中一个可以成功覆盖,shellcode就能执行。(待理解)

    2

    2

  7. 按字节错位引起定位失败从而使shellcode无效。使用按字节相同的双字跳转地址,甚至使用堆中的地址,将shellcode用堆扩展的方法放置在相应区域(Heap spray)。(待理解)

    2

    2

    2

    2

shellcode的编码技术

  • 原因:
  1. 所有的字符串函数都会对NULL字节进行限制,通常需要在shellcode中选择特殊的指令避免直接出现NULL字节或字。

  2. 有些函数还会要求shellcode必须为可见字符的ASCII值或Unicode值。

  3. 基于特征的IDS系统往往会对常见的shellcode进行拦截。

    2

    2

    2

    2

  • 解决:

    编码。先编码使内容达到限制的要求,再构造解码程序放在shellcode开始执行的地方。