1

アセンブリでのより複雑なシステム コールを理解するのに少し苦労しています。私は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[]);

皆さんありがとう

4

2 に答える 2

4

アセンブリのこれらの側面をすばやく進めるための秘訣を次に示します。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
于 2009-11-20T21:18:56.807 に答える
3

文字列をレジスタに入れません。この関数のレジスタで、ヌル (0) で終了する文字列 (C スタイル) へのポインター (アドレス) を渡す必要があります。一部のシステム コール ( などwrite) は、ポインタ (必ずしも で終了する必要はありません'\0') と長さを 2 つのレジスタで受け取ります。

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

$myStringレジスタを使用して渡します。

于 2009-11-20T21:13:27.857 に答える