【问题标题】:Assembly and System Calls汇编和系统调用
【发布时间】:2010-12-18 21:32:58
【问题描述】:

我在理解汇编中更复杂的系统调用时遇到了一些麻烦。我写了一个 exec 系统调用,效果很好

 .bss

.text

.globl _start

_start:

#exit(0) system call

        movl $1, %rax
        movl $0, %rbx
        int $0X80

虽然我有点确定并且无法找到有关如何将字符串放入寄存器的信息。所以作为一个例子,我想做一个 exec 系统调用,它作为它的第一个参数需要一个文件名来运行,我想运行“/bin/bash”,但是我如何在 rbx 中得到它。我怎么知道我必须使用rbx,在X86我知道我会使用ebx,在amd64 ebx=rbx,ecx=rcs等中是不是一样的关系?

int execve(const char *filename, char *const argv[], char *const envp[]);

谢谢大家

【问题讨论】:

    标签: linux assembly x86 system-calls


    【解决方案1】:

    这里有一个技巧可以在汇编的这些方面快速取得进展:让 C 编译器向您展示它是如何做到的!编写一个执行您想做的 C 程序并输入 gcc -S

    例子:

    Manzana:ppc pascal$ cat t.c
    #define NULL ((void*)0)
    char *args[] = { "foo", NULL } ;
    char *env[] = { "PATH=/bin", NULL } ;
    
    
    int execve(const char *filename, char *const argv[], char *const envp[]);
    
    int main()
    {
    
      execve("/bin/bash", args, env);
    
    } 
    

    然后:

    Manzana:ppc pascal$ gcc -S -fno-PIC t.c  # added no-PIC for readability of generated code
    Manzana:ppc pascal$ cat t.s
    .globl _args
        .cstring
    LC0:
        .ascii "foo\0"
        .data
        .align 2
    _args:
        .long   LC0
        .long   0
    .globl _env
        .cstring
    LC1:
        .ascii "PATH=/bin\0"
        .data
        .align 2
    _env:
        .long   LC1
        .long   0
        .cstring
    LC2:
        .ascii "/bin/bash\0"
        .text
    .globl _main
    _main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
        movl    $_env, 8(%esp)
        movl    $_args, 4(%esp)
        movl    $LC2, (%esp)
        call    _execve
        leave
        ret
        .subsections_via_symbols
    

    【讨论】:

      【解决方案2】:

      您不会将字符串放入寄存器中。您应该在此函数的寄存器中将指针(地址)传递给以空 (0) 结尾的字符串(C 风格)。一些系统调用(如write)在两个寄存器中使用一个指针(不一定由'\0' 终止)和长度。

      # somewhere in the data section:
      myString:
         .asciz "/bin/bash"
      

      并使用寄存器传递$myString

      【讨论】:

        猜你喜欢
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        相关资源
        最近更新 更多