Section .text
        global _start

_start:
        jmp short GoToCall

shellcode:
        pop             esi
        xor             eax, eax
        mov byte        [esi+7], al
        lea             ebx, [esi]
        mov long        [esi + 8], ebx
        mov long        [esi + 12], eax
        mov byte        al, 0x0b
        mov             ebx, [esi]
        lea             ecx, [esi + 8]
        lea             edx, [esi + 12]
        int             0x80

GoToCall:
        Call shellcode
        db      "/bin/shJAAAABBBB"


编译完上面的shellcode后,我得到了下面的反汇编。在第三行,我遇到了Segmentaion故障。

(gdb) disassemble shellcode 
Dump of assembler code for function shellcode:
   0x08049002 <+0>: pop    %esi
   0x08049003 <+1>: xor    %eax,%eax
=> 0x08049005 <+3>: mov    %al,0x7(%esi)
   0x08049008 <+6>: lea    (%esi),%ebx
   0x0804900a <+8>: mov    %ebx,0x8(%esi)
   0x0804900d <+11>:    mov    %eax,0xc(%esi)
   0x08049010 <+14>:    mov    q4312078qxb,%al
   0x08049012 <+16>:    mov    (%esi),%ebx
   0x08049014 <+18>:    lea    0x8(%esi),%ecx
   0x08049017 <+21>:    lea    0xc(%esi),%edx
   0x0804901a <+24>:    int    q4312078qx80
End of assembler dump.
(gdb) printf "%s", $esi
/bin/shJAAAABBBB(gdb) printf "%s", $esi+7
JAAAABBBB(gdb) si

Program received signal SIGSEGV, Segmentation fault.
0x08049005 in shellcode ()
(gdb) 


#1 楼

导致SIGSEGV的指令尝试在''h''中的"/bin/shJAAAABBBB"之后存储.text

您的所有代码/数据都在objdump -h部分中,该部分可能是只读的。
运行q4312079q生成的二进制文件,您应该在输出中看到类似以下内容的内容:

  5 .text         00000031  00001000  00001000  00001000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE


,其中包含存储字符串字节的地址。

评论


实际上,对于ELF可执行文件,内存保护是根据段而不是该段设置的。但是无论如何,你是对的。

– wisk
19年3月13日在22:39

如果要写入“ / bin / shJAAAABBBB”并执行shellcode,我必须在汇编中进行哪些更新?

– Mukesh
19年3月15日在1:07

#2 楼

您的shellcode所在并执行的内存不可写。
它可能由于不同的原因而发生,我想您的shellcode被编码为C文字字符串。由于此内存位置不可写,因此会出现异常。

如果您只想尝试shellcode,请使用带有标志mmap(2)PROT_EXEC | PROT_READ | PROT_WRITE分配一个内存页,在其中复制shellcode并跳转到它。

顺便说一句,您的shellcode是无空字节的,如果使用strcpy(3)函数进行复制,则可以删除xor eax, eaxmov [esi+7], al,因为strcpy(3)会为您写入0x00。只需确保将“ / bin / shJAAAABBBB”修剪为“ / bin / sh”即可。

#3 楼

因为/bin/sh需要"AAAABBBB",所以用q4312079q替换q4312079q

#4 楼

正如@booto的答案所示,objdump -h打印出的.text部分是只读的。

您可以尝试像这样编译,而不必更新原始源代码:

nasm -f elf32 -o ./Execve.o Execve.nasm
ld -N -o ./Execve ./Execve.o


ld -N


将文本和数据节设置为可读可写。