Этот вопрос недавно помог мне, поэтому я хотел внести свой вклад, чтобы добавить немного больше глубины в то, что происходит. Как было сказано ранее, вы пропустили третий аргумент open()
. Тем не менее, разрешения, которые вы видите, не случайны; они идут из стека. Посмотрите на следующий фрагмент кода:
asm("push $0");
asm("push $0");
asm("push $0");
fd = open("base", O_RDWR|O_CREAT);
Обратите внимание на следующий результат:
----------. 1 user user 4 Feb 26 08:21 base
Давайте изменим первое нажатие на 1, то есть разрешение на выполнение:
asm("push $1;push $0;push $0");
fd = open("base", O_RDWR|O_CREAT);
и мы получаем:
---------x. 1 user user 4 Feb 26 08:25 base
Измените push на 4, то есть разрешение на чтение, и связывайтесь с двумя другими значениями:
asm("push $4;push $5;push $6");
fd = open("base", O_RDWR|O_CREAT);
и мы получаем:
-------r--. 1 user user 4 Feb 26 08:27 base
Таким образом, мы можем видеть, что третье значение, извлеченное из стека (первое нажатие) - это то, что действительно имеет значение Наконец, для развлечения мы можем попробовать 5, а затем 50, что соответственно приводит к:
-------r-x. 1 user user 4 Feb 26 08:27 base
----rw----. 1 user user 4 Feb 26 08:28 base
Надеюсь, это добавит ясности!