Оказывается, что указание компоновщику эмулировать elf_i386 привело к тому, что я ищу, правда не понимаю зачем. А именно, вызовите компоновщик с помощью:
$ ld -melf_i386 [...]
Файлы, созданные с помощью и без -melf_i386
, в основном похожи:
with.elf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped, with debug_info
without.elf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped, with debug_info
За исключением того, что их размеры сильно различаются:
$ ls -l *.elf
-rwxr-xr-x 1 user user 10948 May 24 11:56 with.elf
-rwxr-xr-x 1 user user 1055428 May 24 11:56 without.elf
Насколько я могу судить, выходные файлы в остальном точно одинаковы:
$ readelf -S with.elf
There are 12 section headers, starting at offset 0x28e4:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00100000 001000 000205 00 AX 0 0 4
[ 2] .eh_frame PROGBITS 00100208 001208 0000b8 00 A 0 0 4
[ 3] .bss NOBITS 001002c0 0012c0 3ef000 00 WA 0 0 4
[ 4] .debug_info PROGBITS 00000000 0012c0 0007bf 00 0 0 1
[ 5] .debug_abbrev PROGBITS 00000000 001a7f 0002c9 00 0 0 1
[ 6] .debug_aranges PROGBITS 00000000 001d48 000060 00 0 0 1
[ 7] .debug_line PROGBITS 00000000 001da8 00023c 00 0 0 1
[ 8] .debug_str PROGBITS 00000000 001fe4 0004bd 01 MS 0 0 1
[ 9] .symtab SYMTAB 00000000 0024a4 000280 10 10 22 4
[10] .strtab STRTAB 00000000 002724 00014e 00 0 0 1
[11] .shstrtab STRTAB 00000000 002872 000070 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
Просто обратите внимание, что поле «смещение» немного отличается
$ readelf -S without.elf
There are 12 section headers, starting at offset 0x1018e4:
Section Headers:
[Nr] Name Type Addr Off Size ES Flg Lk Inf Al
[ 0] NULL 00000000 000000 000000 00 0 0 0
[ 1] .text PROGBITS 00100000 100000 000205 00 AX 0 0 4
[ 2] .eh_frame PROGBITS 00100208 100208 0000b8 00 A 0 0 4
[ 3] .bss NOBITS 001002c0 1002c0 3ef000 00 WA 0 0 4
[ 4] .debug_info PROGBITS 00000000 1002c0 0007bf 00 0 0 1
[ 5] .debug_abbrev PROGBITS 00000000 100a7f 0002c9 00 0 0 1
[ 6] .debug_aranges PROGBITS 00000000 100d48 000060 00 0 0 1
[ 7] .debug_line PROGBITS 00000000 100da8 00023c 00 0 0 1
[ 8] .debug_str PROGBITS 00000000 100fe4 0004bd 01 MS 0 0 1
[ 9] .symtab SYMTAB 00000000 1014a4 000280 10 10 22 4
[10] .strtab STRTAB 00000000 101724 00014e 00 0 0 1
[11] .shstrtab STRTAB 00000000 101872 000070 00 0 0 1
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
p (processor specific)
Вы проводите ложную дихотомию между «входом в систему как root» и «наличием доступа sudo». Не следует думать об этом как о совершенно разных вещах. Если вы не доверяете своим пользователям root-доступ, не позволяйте им использовать sudo! Блокировка только команды sudo su
в любом случае бессмысленна, существует sudo -s
для получения оболочки root или вы можете sudo bash
. Или есть миллион других способов.
Обычно вы не можете создать черный список того, что не могут делать пользователи sudo. Вы потерпите неудачу, поскольку это не должно было работать таким образом. Как только у вас будет доступ к горстке вещей, таких как PID 1, система станет вашей.
Вы можете занести в белый список определенные процессы. Убедитесь, что эти процессы также недоступны для записи пользователем, и убедитесь, что они не принимают вводимые пользователем данные или аргументы таким образом, чтобы разрешить выполнение произвольных команд. Остерегайтесь: многие распространенные инструменты unix так или иначе позволяют выполнять произвольные команды. Хороший метод, если им нужен только доступ sudo для выполнения одной задачи, - создать сценарий оболочки, который выполняет только эту задачу, не принимает аргументов и позволяет пользователю выполнять этот сценарий от имени пользователя root.
Если под мастер-ключом вы имеете в виду ключ, используемый для шифрования контента, его нельзя изменить без перезаписи контейнера LUKS: разблокируйте для доступа к данным, резервного копирования данных, воссоздайте контейнер LUKS и восстановите из резервной копии.
Если то, что вы подразумеваете под мастер-ключом , является просто одной из парольных фраз, используемых для разблокировки контейнера LUKS, то да, их можно изменить, но сначала вы должны знать существующую парольную фразу.
Короче говоря, если вы не хотите, чтобы другой пользователь мог использовать ключи LUKS, не сообщайте ему / ей парольную фразу. Вам не нужно ничего делать с sudo. И, конечно же, сделайте внешнюю резервную копию заголовка LUKS, чтобы вы могли восстановить его, если он когда-либо был поврежден или подделан.