我已经将此代码编写为练习使用jmp-pop-call shellcoding技术的练习:
global _start
section .text
_start:
jmp call_shellcode
shellcode:
pop rsi
;sys_write syscall
xor rax, rax
mov al, 1
xor rdi, rdi
mov dil, 1
xor edx, edx
mov dl, 18
syscall
jmp call_shellcode2
shellcode2:
pop rsi
;sys_red syscall
xor rax, rax
xor rdi, rdi
mov edx, 4
syscall
; exit syscall
xor rax, rax
mov al, 60 ;mov rax, 60
xor rdi, rdi ;mov rdi, 0
add dil, 0
syscall
call_shellcode:
call shellcode
welcome: db 'Insert password: ', 0xa
call_shellcode2:
call shellcode2
input: db 0xffffffff
问题如下:
$ ./simple_shellcode
Insert password:
abc
$ abc
bash: abc: command not found
似乎当我按下Enter键时,我插入的值(加上Enter键)将传递给外壳。我不明白为什么会这样...
您能解释一下我的问题吗?
谢谢。
编辑
在这里,strace
输出:
execve("./BindShell", ["./BindShell"], 0x7fff3b5e0d00 /* 49 vars */) = 0
write(1, "Insert password: \n", 18Insert password:
) = 18
read(0, 123
0x40104f, 4) = -1 EFAULT (Invalid address)
exit(0) = ?
+++ exited with 0 +++
正如Peter Cordes在评论中所说,read
函数返回-1 EFAULT
并使用--omagic
选项将其组装起来可以正常工作。
现在,我的问题是:一个干净的解决方案是否可以通过jmp-pop-call技术使用该选项?