这是一个很棒的网站,列出了各种ASCII汇编指令(包括ASCII nops),如果你很好奇的话.使用这些指令,您可以构建仅包含ASCII字符的整个程序.在黑帽工作的背景下,这些说明对于绕过入侵检测系统和文本过滤器非常方便.
例如,序列ABCDEFGIJKLMNO是x86无操作,尽管基本上看起来像字母顺序.此外,如果您不关心丢弃某些寄存器,则可以创建ASCII指令序列,这些指令除了递增或递减这些寄存器之外什么都不做.
如果你正在尝试使用这些多字节的nop来构建一个nop-sled,请注意(AFAIK)不可能在没有使用的情况下制作一个真正的nop-sled nop,可以在任何字节偏移处输入,并且仍然可以执行精确的无操作.但是,使用像AI(inc ecx; dec ecx)这样的指令比使用多字节NOP序列更安全,因为如果输入错误的偏移量,序列只会删除寄存器(而多字节NOP可能会导致非法指令异常或做出意外的事情).
无论如何,通常情况下,您可以通过C中的缓冲区复制任何多字节序列(提供的sizeof(buffer)是操作长度的倍数):
/* I find string notation to be more convenient, but it means using `sizeof(op)-1` to get the op length */
static char op[] = "\xaa\xbb\xcc";
char buffer[3072];
int i;
for(i=0; i<sizeof(buffer); i++)
buffer[i] = op[i%(sizeof(op)-1)];
Run Code Online (Sandbox Code Playgroud)