nop sled 是一種可以破解棧隨機化的緩沖區溢出攻擊方式。
攻擊者通過輸入字符串注入攻擊代碼。在實際的攻擊代碼前注入很長的 nop 指令 (無操作,僅使程序計數器加一)序列,
只要程序的控制流指向該序列任意一處,程序計數器逐步加一,直到到達攻擊代碼的存在的地址,並執行。
棧隨機化指運行時棧的起始地址為隨機的,所以程序中存放 各函數返回地址 的地址也會發生對應的改變。可防止運行相同
程序的相同系統因易預測棧地址而易於攻擊。
由於棧地址在一定范圍的隨機性,攻擊者不能夠知道攻擊代碼注入的地址,而要執行攻擊代碼需要將函數的返回地址更改為攻擊代碼的地址(可通過緩沖區溢出的方式改寫函數返回地址)。所以,只能在一定范圍內(棧隨機導致攻擊代碼地址一定范圍內隨機)枚舉攻擊代碼位置(有依據的猜) 。
若 :
棧隨機范圍為 2 ^ 23 ,則需要枚舉 2 ^23 個 返回地址。
而使用 nop sled 的方式 ,若 枚舉 一個 255 字節的 nop sled ,則只需要枚舉 (2 ^ 23) / (255+1) 個返回地址即可。(攻擊代碼本身有一個起始地址。所以為 255+1)
即 :
不用 nop sled , 函數返回地址 -------> 攻擊代碼。
使用 nop sled , 函數返回地址 -------> nop 序列(順序執行) 直到攻擊代碼地址。