· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› [at&t][FreeBSD] Криво ставятся права на файл.

Посл.отвђт Сообщенiе


Дата: Июн 3, 2004 11:18:26

Приветствую господа!
У меня возник простой вопросик. По идее этот код должен менять права у файла kewl на 777. Но почему-то права меняются, но "криво"

.globl _start
_start:
xor %eax,%eax
push %eax
pushl $0x6c77656b # - имя файла
movl %esp,%ecx
pushw $0777 # - Права владения которые я хочу поставить.
movl %esp,%edx
pushl %edx
pushl %ecx
pushl $15 # системный вызов chmod
push %eax
int $0x80
addl $16,%esp
xor %eax,%eax
push $1
push %eax
int $0x80
Но вместо ожидаемого
-rwxrwxrwx выставляются -r-sr-x-wT. А почему это происходит я понять не могу :( Если у кого есть какие соображения по этому поводу, покажите мне где моя ошибка.
Заранее спасибо за ответы.
p.s. ОС - FreeBSD 4.10


Дата: Июн 3, 2004 11:39:52

looser
Попробуй передавать сами права, а не их адрес. Если не поможет то попробуй перебрать все биты, чтобы узнать который за что отвечает. Или найди код утилиты chmod и посмотри что она с правами делает прежде чем отдаст их ядру. Может "или" с какой-то маской нуждо сделать.


Дата: Июн 3, 2004 12:05:43

Спасибо за ответ! Буду пробовать.


Дата: Июн 6, 2004 01:32:15

Господа! Простой ведь вопрос. Я уже и не знаю где копать. Неужели никто не занимался программированием на asm для BSD.


Дата: Июн 6, 2004 01:45:27

> Господа! Простой ведь вопрос. Я уже и не знаю где копать.
> Неужели никто не занимался программированием на asm для BSD.
я занимался. но давно...
как сейчас помню, что при вызове int 80h в eax (точнее в al) должен быть код системного вызова, а у тебя там 0.


Дата: Июн 7, 2004 11:24:09

...
push $15
push %eax
...
так что в %eax именно номер системного вызова N15 (chmod).
Дело не в этом. Права-то он хоть как-то меняет. Значит с номером системного вызова все ок.
Видимо как-то не правильно передается числовое значение новых прав доступа...


Дата: Июн 7, 2004 12:38:16

...
push $15
push %eax
...

и что, после этого eax == $15 ?


Дата: Июн 7, 2004 12:51:41

> Дело не в этом. Права-то он хоть как-то меняет.
именно в этом. фря ожидает увидеть в al код вызова, а ebx - поинтер на имя, но у тебя она жестоко обламывается ;)
тут на wasm'е где-то было выложено руководство по shell-кодам от lsd team, там системные вызовы в разных осях довольно подробно разобраны, правда чмода я там не нашел, пришлось рыться в своих ветхих записях

> Видимо как-то не правильно передается числовое значение новых прав доступа...
ну и это тоже, - там не pushw, а pushl - я как-то даже поначалу не обратил на это внимание. делать надо примерно вот так:
xor      %eax, %eax
pushl    %eax                      # завершающий нуль
pushl    $0xXXXXXX                 # имя файла
pushl    $0xXXXXXX                 # имя файла
pushl    $0xXXXXXX                 # имя файла
movl     %esp, %ebx                # в EBX фря ждет указатель на имя
push     %eax
push     %eax
push     %ebx
push     %eax
mov      $0x10, %al                # syscal chown 
int      $0x80

xor      %eax, %eax
or       $0xded, %ax               # eax = 06755
pushl    %eax                      # 06755, но не w, а l
push     %ebx                      # имя
pushl    %eax
xor      %eax, %eax
mov      $0xf, %al                 # syscall chmod 
int      $0x80


Дата: Июн 9, 2004 10:30:48

Огромное спасибо за ответы!
Все получилось. Вот какой код вышел:

.globl _start
_start:
xor %eax, %eax
pushl %eax
pushl $0x6c77656b
movl %esp, %ebx
push %eax
push %eax
push %ebx
push %eax
mov $16,%al
int $0x80
xor %eax,%eax
or $0777,%eax
pushl %eax
push %ebx
pushl %eax
xor %eax,%eax
mov $15,%al
int $0x80
xor %eax,%eax
inc %eax
int $0x80

p.s. Мне не понятен только один момент. А для чего использовался системный вызов chown - он-же служит для смены правл владения файлом для пользователя/группы. ?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.081