|
|
| Посл.отвђт | Сообщен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 |