nop sled 是一种可以破解栈随机化的缓冲区溢出攻击方式。
攻击者通过输入字符串注入攻击代码。在实际的攻击代码前注入很长的 nop 指令 (无操作,仅使程序计数器加一)序列,
只要程序的控制流指向该序列任意一处,程序计数器逐步加一,直到到达攻击代码的存在的地址,并执行。
栈随机化指运行时栈的起始地址为随机的,所以程序中存放 各函数返回地址 的地址也会发生对应的改变。可防止运行相同
程序的相同系统因易预测栈地址而易于攻击。
由于栈地址在一定范围的随机性,攻击者不能够知道攻击代码注入的地址,而要执行攻击代码需要将函数的返回地址更改为攻击代码的地址(可通过缓冲区溢出的方式改写函数返回地址)。所以,只能在一定范围内(栈随机导致攻击代码地址一定范围内随机)枚举攻击代码位置(有依据的猜) 。
若 :
栈随机范围为 2 ^ 23 ,则需要枚举 2 ^23 个 返回地址。
而使用 nop sled 的方式 ,若 枚举 一个 255 字节的 nop sled ,则只需要枚举 (2 ^ 23) / (255+1) 个返回地址即可。(攻击代码本身有一个起始地址。所以为 255+1)
即 :
不用 nop sled , 函数返回地址 -------> 攻击代码。
使用 nop sled , 函数返回地址 -------> nop 序列(顺序执行) 直到攻击代码地址。