这是我的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)
,我该如何解决?
谢谢,