您似乎完全困惑了,太多了,无法列出所有错误。然而,这里有一个不完整的列表:
-
您将esi设置为零意味着
argv
是
NULL
-
push nullbyte to the stack
实际上是
无效的
用于终止的指针
argv
数组(它不是一个以字符串结尾的零字节)。
-
您需要将文件名的地址设置为
argv[0]
. 您不需要将字符串复制到堆栈中。
以下是固定版本:
.section .data
name: .string "/bin/bash"
.section .text
.globl _start
_start:
# third argument of execve is envp, set to NULL
xor %rdx, %rdx
# push NULL to the stack, argv terminator
pushq %rdx
# first argument to execve is the file name
leaq name, %rdi
# also argv[0]
push %rdi
# second argument to execve is argv
mov %rsp, %rsi
#copy 59 to rax, defining syscall number for execve
movq $59, %rax
syscall
以及从代码在堆栈上创建字符串(不含零字节)的版本:
.section .text
.globl _start
_start:
# third argument of execve is envp, set to NULL
xor %rdx, %rdx
# zero terminator
push %rdx
# space for string
sub $16, %rsp
# end is aligned to the zero terminator
movb $0x2f, 7(%rsp) # /
movl $0x2f6e6962, 8(%rsp) # bin/
movl $0x68736162, 12(%rsp) # bash
# first argument to execve is the file name
leaq 7(%rsp), %rdi
# push NULL to the stack, argv terminator
pushq %rdx
# also argv[0]
push %rdi
# second argument to execve is argv
mov %rsp, %rsi
# copy 59 to rax, defining syscall number for execve
# avoid zero byte
xor %eax, %eax
movb $59, %al
syscall