LINUX.ORG.RU

Linux mmap assembler


0

0

Всем привет!
При вызове mmap(); прога выдает отрицательное число но сам файл открывается и смещение выполняется

;-------------------------------------------------
// filename - asciiz

open_file:
    mov	eax,SYS_open
    mov	ebx,filename
    mov	ecx,O_RDWR
    int	0x80
    cmp	eax,0xFFFFF000
    ja	exit

    xchg eax,ebx
    
    mov	eax,SYS_lseek // lseek(fd,0,2);
    mov	ecx,0
    mov	edx,2

    int	0x80

    xchg eax,edx
    
    push ebx

    push 0
    push ebx
    push 1
    push 3
    push edx
    push 0
    mov	eax,SYS_mmap // mmap(0,edx/*file size*/,PROT_READ|PROT_WRITE,MAP_SHARED,ebx/*filedecrypter*/,0);
    mov	ebx,esp
    int	0x80
    add esp,byte 24
    pop	ebx
    cmp eax,0xFFFFF000
    ja exit

exit:
    mov	eax,1
    xor	ebx,ebx
    int	0x80

;-------------------------------------------------

на выходе в eax = 0xFFFFFFF7

> прога выдает отрицательное число но сам файл открывается и смещение >выполняется

насколько я помню mmap возвращает указатель,
указатель в виде числа может быть и отрицательным,
это ничему не противоречит.

fghj ★★★★★
()
Ответ на: комментарий от redliner

> мм тупой вопрос как проверить?

просто распечатываем errno (printf + 0x80), благо это extern переменная и при линковце должна видиться из *.s файла.

asgard
()
Ответ на: комментарий от asgard

<flame>
А лучше писать на С, а для скорости существуют ассемблерные вставки.
</flame>

krum
()

> push 0
> push ebx
> push 1
> push 3
> push edx
> push 0
> mov eax,SYS_mmap // mmap(0,edx/*file size*/,PROT_READ|PROT_WRITE,MAP_SHARED,ebx/*filedecrypter*/,0);
> mov ebx,esp
> int 0x80

а чему равно SYS_mmap? судя по тому, что вы передаете параметры через стэк,
вы используете old_mmap(), тогда SYS_mmap должно быть равно __NR_mmap == 90.
sys_mmap2() вообще-то соответствует __NR_mmap2 == 192, так что проверьте, что
вы то, что нужно вызываете.

> на выходе в eax = 0xFFFFFFF7

-9, те -EBADF

про errno забудьте, kernel его никогда не трогает.

смотрите сами, что там у вас не так с правильным заполнением mmap_arg_struct,
мне даже лень подумать о том, чтобы читать этот asm ;)

можно вопрос... зачем???

idle ★★★★★
()

да вы правы old_mmap под номером 90
я перепутал немного код ошибки вот она 0xFFFFFFF3 то есть EACCESS

я стану писать на С если вы скажете как сделать чтобы прога динамически не линковалась с libc и в тоже время чтобы не был бинарник большим

redliner
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.