리눅스 용 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 만 수정된다는 것을 보여줍니다. 나는 다시 붙어있다. 늦게 물러서서 내일 다시 볼거야.
C에서 "mmap()"호출을 코딩 한 다음 "gcc -S"로 컴파일하십시오. 그러면 어셈블리 출력이 덤프되고 루틴 호출 방법을 정확하게 보여줍니다. 참고 : 모든 플랫폼이 Linux syscall을 (이미 알고있는 것처럼) 동일한 방식으로 만드는 것은 아닙니다. 하나의 Linux 플랫폼 용 어셈블리가 다른 플랫폼에 맞지 않을 수도 있습니다. – paulsm4
예, 라이브러리에서 mmap 함수를 호출하는 방법을 보여 주지만, 현재 작업하고있는 환경 (빈 initramfs)에는 표준 라이브러리가 없습니다. – Lennart
기본적으로 ['mmap_arg_struct'] (http://lxr.free-electrons.com/source/mm/mmap.c#L1356)를 스택에 놓고 ebx의 주소를 찾아서 syscall을 실행합니다. (http://syscalls.kernelgrok.com/) – mata