发布于

No eXecute

作者

正如你所预料的那样,程序员对于人们可以将自己的指令注入到程序中 感到非常高兴(bushi NX 位代表「不可执行」,将内存区域定义为 指令数据,把需要写入数据的内存标识为可写,把保存指令的内存标识为可执行,但不会有一块内存同时被标识为可写和可执行。这意味着你的输入将被存储为 数据,任何将其作为指令运行的尝试都会使程序崩溃,从而有效地阻止 shellcode。

为了绕过 NX,我们必须使用一种被称为 ROP,Return-Oriented Programming(面向返回编程)的技术。

Note

Windows 版本的 NX 是 DEP (Data Execution Prevention),数据执行保护。

检查 NX

你可以使用 checksec 来检查 NX 的状态。

$ checksec vuln
[*] 'vuln'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments