Assembly 分段错误外壳代码

Assembly 分段错误外壳代码,assembly,x86,nasm,32bit-64bit,shellcode,Assembly,X86,Nasm,32bit 64bit,Shellcode,我一直在尝试创建一个外壳代码,它使用FSTENV GetPC技术获取XOR编码的外壳代码,对其进行解码并将控制权传递给它。代码是: global _start section .text _start: fldz fstenv [esp -0xc] pop esi add esi , 0x11 decode: xor byte [esi] , 0xAA jz Shellcode

我一直在尝试创建一个外壳代码,它使用FSTENV GetPC技术获取XOR编码的外壳代码,对其进行解码并将控制权传递给它。代码是:

global _start
section .text 
_start:

        fldz
        fstenv [esp -0xc]
        pop esi
        add esi , 0x11

decode:
        xor byte [esi] , 0xAA
        jz Shellcode
        inc esi
        jmp short decode


    Shellcode : db 0x9b,0x6a,0xfa,0xc2,0xc8,0xcb,0xd9,0xc2,0xc2,0xc8,0xc3,0xc4,0x85,0xc2,0x85,0x85,0x85,0x85,0x23,0x49,0xfa,0x23,0x48,0xf9,0x23,0x4b,0x1a,0xa1,0x67,0x2a,0xaa
此代码基于我编写的另一个类似代码:

global _start
section .text
_start:
        jmp short call_decoder
decoder :
        pop esi
decode:
        xor byte [esi] , 0xAA
        jz Shellcode
        inc esi
        jmp short decode
call_decoder:
        call decoder
        Shellcode : db 0x9b,0x6a,0xfa,0xc2,0xc8,0xcb,0xd9,0xc2,0xc2,0xc8,0xc3,0xc4,0x85,0xc2,0x85,0x85,0x85,0x85,0x23,0x49,0xfa,0x23,0x48,0xf9,0x23,0x4b,0x1a,0xa1,0x67,0x2a,0xaa
现在,当使用nasm编译和执行时,它们都会导致分段错误。然而,当在C程序中使用时,第一个程序似乎不起作用,并导致分段错误,而第二个程序工作正常

此外,使用GDB进行的分析表明,在第一种情况下,错误发生在XOR语句中。GDB输出如下:

Program received signal SIGSEGV, Segmentation fault.
Dump of assembler code from 0x804806b to 0x8048075:
=> 0x0804806b <decode+0>:       xor    BYTE PTR [esi],0xaa
   0x0804806e <decode+3>:       je     0x8048073 <Shellcode>
   0x08048070 <decode+5>:       inc    esi
   0x08048071 <decode+6>:       jmp    0x804806b <decode>
   0x08048073 <Shellcode+0>:    fwait
   0x08048074 <Shellcode+1>:    push   0xfffffffa
End of assembler dump.
0x0804806b in decode ()

同时ESI指向外壳代码的第一到第一个字节[如预期的那样]

(gdb) x/xb $esi
0x8048073 <Shellcode>:  0x9b 
(gdb)x/xb$esi
0x8048073:0x9b
用于创建可执行文件的命令有:

nasm -f elf32 -o <Linker Object> <Nasm File>
ld -o <Executable Name> <Linker Object>
nasm-f elf32-o
ld-o
那么,第一个代码哪里出了问题?我该如何纠正它


PS:我使用了来自

的引用使用调试器验证
[esi],0xaa
是否指向有效的内存地址。
。默认情况下,text
节是只读的。使其可写。您没有显示用于生成可执行文件的命令。@如我所说,$esi指向外壳代码的第一个字节。@Jester我添加了详细信息。另外,我知道
.text
部分不可写,分段错误预计会发生,但是shell代码在输入C程序时,第一个不工作,第二个工作!显然,一旦您修复了RWX页面权限错误,第一个错误就有了其他一些错误,这也导致了崩溃。您只发布了机器代码,而不是反汇编。使用调试器在不工作的崩溃中查找崩溃,并对其进行调试。
nasm -f elf32 -o <Linker Object> <Nasm File>
ld -o <Executable Name> <Linker Object>