Доброе утро, господа и дамы… На картинки пока НЕ смотрим, всё станет прозрачным чуть позже.
Создаём подопытный файл под рутом:
echo 'some text' > test.txt
Затариваем его:
tar -cf test.tar test.txt
Теперь открываем в hexdump:
hexdump -C test.tar
Так, открыли. Смотри первую картинку к этому посту. Видишь root/root? Это имя владельца и имя группы файла. Так вот, при создании архива эти поля можно изменять.

Давай изменим:
tar --owner='bash' --group='days' -cf test.tar test.txt
Окей. Снова открываем в hexdump:
hexdump -C test.tar
Смотрим вторую картинку. На ней видим интересную ситуацию: пользователь изменился на bash, а группа — на days. Но в системе у нас нет такого пользователя и группы. Хотя ожидаемый результат должен быть — user/group not found или что-то подобное.

-rw-r--r-- bash/days 10 2023-10-23 05:09 test.txt
Баг или фича? Причём, если растарить такой файл с ключом -p или без него, bash/days вернутся к root/root.
А теперь создадим с user/user — этот пользователь и группа есть в системе.
tar --owner='user' --group='user' -cf test.tar test.txt
Распаковываем:
tar -xf test.tar
И видим ситуацию, что у файла test.txt пользователь и группа user/user. Великолепно! Вот такое интересное поведение.
Из документации по tar: по смещениям 108 и 116 находятся uid и gid.
char uid[8]; /* 108 */
char gid[8]; /* 116 */
Давай посмотрим смещение 108:
hexdump -Cs108 -n8 test.tar
Получаем:
0000006c 30 30 30 31 37 35 30 00 |0001750.|00000074
Конвертим 0001750 в uid:
echo $(( 8#1750 ))
Опа, получили 1000, что соответствует пользователю user. А если этот трюк провернуть с bash/days, то получим uid того пользователя, под которым тарили файл.
Давай, увидимся вечерком!








Комментарии