来自Assembly的sys_execve系统调用

Ale*_*x F 4 linux x86 assembly system-calls

asm_execve.s:

.section .data
file_to_run:
.ascii       "/bin/sh"

.section .text
.globl main

main:
    pushl %ebp
    movl %esp, %ebp
    subl $0x8, %esp         # array of two pointers. array[0] = file_to_run  array[1] = 0

    movl file_to_run, %edi
    movl %edi, -0x4(%ebp)   
    movl $0, -0x8(%ebp)

    movl $11, %eax                      # sys_execve
    movl file_to_run, %ebx              # file to execute       
    leal -4(%ebp), %ecx                 # command line parameters
    movl $0, %edx                       # environment block
    int  $0x80              

    leave
    ret

生成文件:

NAME = asm_execve
$(NAME) : $(NAME).s
    gcc -o $(NAME) $(NAME).s

程序已执行,但未调用sys_execve:

alex@alex32:~/project$ make
gcc -o asm_execve asm_execve.s
alex@alex32:~/project$ ./asm_execve 
alex@alex32:~/project$ 

预期产出是:

alex@alex32:~/project$ ./asm_execve 
$ exit
alex@alex32:~/project$

这个汇编程序应该像下面的C代码一样工作:

char *data[2];
data[0] = "/bin/sh"; 
data[1] = NULL;
execve(data[0], data, NULL);

系统调用参数有问题吗?

Mat*_*ery 10

execve系统调用被调用,但你确实传递错误参数.

(您可以通过使用运行可执行文件来查看strace.)

有三个问题:

  1. .ascii不会终止字符串.(你可能会很幸运,因为.data在这个例子中你的部分没有任何内容,但是不保证...)添加0,或者使用.asciz(或.string)代替.

  2. movl file_to_run, %edi移动值指向由所述file_to_run符号到%edi,即,第一个4个字节的字符串(0x6e69622f).字符串的地址只是符号本身的值,因此您需要使用$文字值的前缀:movl $file_to_run, %edi.同样,你需要再说movl $file_to_run, %ebx几行.(这是AT&T语法和Intel语法之间混淆的常见原因!)

  3. 参数以错误的顺序放在堆栈中:-0x8(%ebp)地址低于-0x4(%ebp).因此应该写入命令字符串的地址,应该写入-0x8(%ebp)0 -0x4(%ebp),并且leal指令应该是leal -8(%ebp), %ecx.


固定代码:

.section .data
file_to_run:
.asciz       "/bin/sh"

.section .text
.globl main

main:
    pushl %ebp
    movl %esp, %ebp
    subl $0x8, %esp         # array of two pointers. array[0] = file_to_run  array[1] = 0

    movl $file_to_run, %edi
    movl %edi, -0x8(%ebp)   
    movl $0, -0x4(%ebp)

    movl $11, %eax                      # sys_execve
    movl $file_to_run, %ebx              # file to execute       
    leal -8(%ebp), %ecx                 # command line parameters
    movl $0, %edx                       # environment block
    int  $0x80              

    leave
    ret
Run Code Online (Sandbox Code Playgroud)