栈汇编值修改问题:用0x63异或esi指向字节报错,求修复方法
修复XOR解密汇编代码的运行错误
嘿,我看了你这段XOR解密的汇编代码和报错,问题其实很明确——你在尝试修改只读内存区域,所以触发了段错误(Segmentation Fault)。
问题根源
你用db定义的code部分,默认会被编译器放到程序的.text段(代码段)里,而绝大多数操作系统的代码段都是只读的。当你执行xor byte [esi], al这条指令时,本质是在往只读内存里写数据,系统自然会抛出权限错误,也就是你看到的报错。
修复方案
这里给你两种靠谱的解决办法,按需选择:
方法1:把解密后的代码移到可写区域执行(推荐)
栈区域默认是可读、可写、可执行的(多数环境下),我们可以把解密后的代码复制到栈上,再跳过去执行。修改后的代码如下:
global _start _start: jmp short shell decode: pop esi ; 获取加密code的起始地址 xor ecx, ecx mov cl, 21 ; 加密数据长度,用cl更节省字节 mov al, 0x63 ; 异或密钥 mov edi, esp ; 把栈顶作为可写的目标地址 copy_and_decrypt: mov bl, byte [esi] ; 读取加密字节 xor bl, al ; 执行异或解密 mov byte [edi], bl ; 写入栈上的可写区域 inc esi inc edi loop copy_and_decrypt jmp edi ; 跳转到栈上的解密后代码执行 shell: call decode code: db 0xd3,0x68,0x31,0x0b,0x4c,0x4c,0x10,0x68,0x0b,0x4c,0x01,0x0a,0x0d,0xea,0x80,0x31,0x30,0xea,0x82,0xae,0xe3
这个修改的核心是:不再直接修改原代码段的只读内容,而是先解密再复制到可写的栈区域,从栈上执行解密后的代码,完美避开权限问题。
方法2:修改代码段的权限(不推荐)
如果你只是想快速验证功能,也可以通过编译链接参数让.text段变成可写可执行。用NASM和LD的话,执行以下命令:
nasm -f elf32 yourfile.asm -o yourfile.o ld -m elf_i386 -N yourfile.o -o yourfile
其中-N参数会强制让.text段拥有可读可写可执行权限。不过这种方法不符合安全规范,在很多严格的系统环境下会被限制,所以只建议临时测试用。
额外小优化
- 原来的
mov ecx, 21可以改成mov cl, 21,因为前面已经用xor ecx, ecx把整个ecx清零了,用cl操作低8位更节省指令字节。 - 确保你编译的是32位程序,因为代码里用的是x86架构的寄存器(esi、ecx等),所以编译时要指定
-f elf32,链接时指定-m elf_i386。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

