2009-11-20 8 views
1

어셈블리에서 더 복잡한 시스템 호출을 이해하는 데 약간의 어려움이 있습니다. 나는 간부 시스템 호출을 쓴 내가 조금 확보하고 레지스터에 문자열을 넣어하는 방법에 관한 정보를 찾을 수 없어 생각하지만 그것은 큰어셈블리 및 시스템 호출

.bss 

.text 

.globl _start 

_start: 

#exit(0) system call 

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

을했다. 예를 들어 exec 시스템 호출을 원했고 첫 번째 매개 변수는 실행할 파일 이름이 필요하므로 "/ bin/bash"를 실행하려고했지만 rbx에서는 어떻게 가져올 수 있습니까? 나는 X86에서 rbx를 사용해야한다는 것을 어떻게 알 수 있습니까? ebx를 사용할 것임을 알고 있습니다. amd64 ebx = rbx, ecx = rcs 등에서 동일한 관계입니까?

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

감사합니다 모두

답변

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 
3

문자열을 레지스터에 넣지 마십시오. 이 함수의 레지스터에서 널 (0) 종료 문자열 (C 스타일)에 포인터 (주소)를 전달해야합니다. 일부 시스템 호출 (예 : write)은 포인터 (반드시 '\0'로 종료되지 않아도 됨)와 길이를 두 개의 레지스터로 취합니다.

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

그리고 패스를 사용하여 $myString을 전달하십시오.

+0

은 지금 감사를 이해합니다. – Recursion

+0

하지만 .asciiz를 의미하므로 null이 종료 되었습니까? – Recursion

+0

재귀 : 예. –