2013-05-04 1 views
0

리눅스 용 nasm에 작은 라이브러리를 작성 중이며 malloc atm을 구현 중입니다.리눅스에서 int 0x80을 사용하는 nasm에서 mmap

void * malloc(int size) { 
    return mmap(0, size, 3, 34, -1, 0); 
} 

가 지금은 어셈블리에 그 변환해야하지만, 내가 인수를로드에 붙어있어 같은 코드의 C 표현이 보일 것이다.

mov eax, 90 
; load args (help) 
int 0x80 
; move adress to eax 

C 코드를 asm으로 변환하는 방법을 알고 싶습니다. 대부분의 경우 syscall의 인수는 어셈블리와 동일한 순서로 매핑되지만 mmap은 6 개의 인수를 가지며 커널은 최대 5 개의 인수를 사용합니다.

반환 값이 저장되는 위치를 알고 싶습니다.

그럼 어떻게 구현해야합니까?

업데이트 :

코드 :

section .data 
mmap_arg: ; ugly 
    .addr: dq 0 
    .len: dq 512 
    .prot: dq 3 
    .flags: dq 34 
    .fd:  dq -1 
    .offset: dq 0 

mmap_test: 
    mov eax, 90 
    mov ebx, mmap_arg 
    int 0x80 

그것의 작업처럼 보이지만, 나는 EAX의 주소에서 뭔가를로드 할 때, 나는 세그먼트 폴트를 얻을. eax를 ebx로 대체하면 오류없이 실행됩니다. 반환 된 주소가 ebx인지 또는 ebx를 사용할 때 .data 섹션에 쓰는지 확인할 수 있습니까?

Gdb는 int 0x80 이후에 eax 만 수정된다는 것을 보여줍니다. 나는 다시 붙어있다. 늦게 물러서서 내일 다시 볼거야.

+0

C에서 "mmap()"호출을 코딩 한 다음 "gcc -S"로 컴파일하십시오. 그러면 어셈블리 출력이 덤프되고 루틴 호출 방법을 정확하게 보여줍니다. 참고 : 모든 플랫폼이 Linux syscall을 (이미 알고있는 것처럼) 동일한 방식으로 만드는 것은 아닙니다. 하나의 Linux 플랫폼 용 어셈블리가 다른 플랫폼에 맞지 않을 수도 있습니다. – paulsm4

+0

예, 라이브러리에서 mmap 함수를 호출하는 방법을 보여 주지만, 현재 작업하고있는 환경 (빈 initramfs)에는 표준 라이브러리가 없습니다. – Lennart

+1

기본적으로 ['mmap_arg_struct'] (http://lxr.free-electrons.com/source/mm/mmap.c#L1356)를 스택에 놓고 ebx의 주소를 찾아서 syscall을 실행합니다. (http://syscalls.kernelgrok.com/) – mata

답변

2

하나의 변경 사항은 args 정의가 ia32의 dq가 아니고 dd 여야합니다. 아래의 mallocSample 함수는 최근 할당 된 메모리를 eax에 반환합니다.

 global main 
     extern printf 

     section .data 
mmap_arg: ; ugly 
    .addr: dd 0 
    .len: dd 512 
    .prot: dd 3 
    .flags: dd 34 
    .fd:  dd -1 
    .offset: dd 0 

     section .text 

mallocSample: 
     ;old_mmap 
     mov eax, 90 
     lea ebx, [mmap_arg] 

     int $80 

     ret 

main: 
     ;malloc sample 
     call mallocSample 
     push eax 
     push message 
     call printf 
     add  esp, 8 
     ret 
message: 
     db  'our malloc gives address: 0x%x', 10, 0 
+0

고맙습니다. dword에 주소 등을 저장하는 것이 훨씬 의미가 있습니다. 'lea a, [b]'와'mov a, b' (속도 제외)의 큰 차이점은 무엇입니까? – Lennart

+1

이 경우 없음. http://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction에서 lea/mov의 차이점을 읽을 수 있습니다. 위의 대답을 편집하여 명확하게 남겨 두겠습니다. – elvena