我一直在读这本书:黑客,剥削的艺术
在第140页,这本书解释了Nop幻灯片:
我们将创建这些 NOP 指令的大型数组(或雪橇)并将其放置 在外壳代码之前;然后,如果 EIP 寄存器指向 中找到的任何地址 NOP滑板,它将在执行每个NOP指令时递增,一个在 一段时间,直到它最终到达外壳代码。这意味着只要 返回地址被 NOP 托架(EIP)中的任何地址覆盖 寄存器将沿着雪橇滑到外壳代码,这将正确执行。
但是使用这种技术,我们会用0x90覆盖返回地址,不是吗?EIP 将转到0x90,从而导致段错误。那么,你能清楚地向我解释这个技巧吗?谢谢:)
不,您不会使用 NOP 雪橇重写返回地址。一旦你得到了正确的偏移量,你必须用地址重写返回地址,什么指向你的NOP指令的某个地方。而且由于NOP雪橇放置在您的shellcode之前,因此它将向下滑动并执行shellcode。因此,60字节长的NOP雪橇无所作为。
这是因为(你可以在那本书中找到关于它的一切):
NOP 是一个汇编指令,是"无操作"的缩写。是的 一个绝对不执行任何操作的单字节指令。
@Yeez答案
NOP雪橇(如前所述,没有操作)被称为雪橇,因为;它看起来像一个
[nop sleds][shellcode]
因此,如果您"降落"在nop
(又名x90
,或者陈词滥调也xchg eax, eax
(两者都是NOP))
它只会"向下滑动"到外壳代码
如果我们碰巧到达这里,在 2 号: [nop] [nop]; the last one
然后我们将沿着它"滴答/雪橇/滑动/爬行",直到我们到达我们的shellcode(此时我们执行该shellcode)
[nop] [nop] [nop] [shellcode]
^ go ^ go ^ go ^ execute
在 RASM2 中进行测试
(雷达2的工具,比如msf-nasm
,如果你习惯的话)
rasm2 -a x86 -b 32 "xchg eax, eax"