Це банально!
Просто подивіться на вихідний код kate та kwrite:
diff --git a/kate/main.cpp b/kwrite/main.cpp
У перших рядках коду безпосередньо на початку "основної" функції ви знайдете:
/**
* Check whether we are running as root
**/
if (getuid() == 0) // uid = user id = 0 ==> means if you are user 0 (aka root)
{
std::cout << "Executing Kate as root is not possible. To edit files as root use:" << std::endl;
std::cout << "SUDO_EDITOR=kate sudoedit <file>" << std::endl;
return 0;
}
Дельфін не відрізняється, за винятком випадків, коли це відбувається в libkdeinit5_dolphin.so.
Отже, як root є тривіальним, все, що нам потрібно зробити, - пропустити прапорець if uid = 0.
Як ми це робимо, - це за допомогою перманентної патчі кате, квірте та дельфіна.
Отже, перше, що ми робимо, - це скидання бінарного вмісту в текстовий файл:
objdump -Crd /usr/bin/kate >> ~/kate.txt
objdump -Crd /usr/bin/kwrite >> ~/kwrite.txt
Тепер ви можете переглянути файл за допомогою gedit ~/kate.txt
, і якщо ви шукаєте getuid, ви знайдете щось на зразок:
2a985: 31 c0 xor %eax,%eax
2a987: 89 bc 24 dc 00 00 00 mov %edi,0xdc(%rsp)
2a98e: e8 ed ce ff ff callq 27880 <getuid@plt>
2a993: 85 c0 test %eax,%eax
2a995: 0f 84 e9 1e 00 00 je 2c884 <__cxa_finalize@plt+0x1f5c>
Тепер, з лівого боку, ви знаходите адресу пам'яті, після двокрапки (:) ви побачите двійковий код інструкцій (шістнадцятковий), а праворуч від цього ви побачите демонтаж цього коду (він же що це означає) .
Тепер, ви бачите, там він викликає getuid, тестує, якщо це дорівнює нулю, і стрибає в оператор if, тобто, якщо значення повернення дорівнює нулю (je: jump, якщо рівне).
Тепер ми не хочемо стрибати у if, тому просто видалимо цю лайно там. Але лише видалення цього лайна змінило б адреси на 6 байт, проміняючи будь-які відносні стрибки програми в процесі, і, як наслідок, програму. Так що замість того, щоб просто замінити всю довжину заяви стрибка з NOP (скорочено N O Op кість) інструкції, ака 0x90 в інструкції коду / гекс.
Тож вам потрібно замінити кожен байт стрибка на 0x90, так що раніше у вас був
0f 84 e9 1e 00 00
Ви будете мати
90 90 90 90 90 90
Це можна зробити просто за допомогою шестигранного редактора.
Отже, ми встановлюємо один:
sudo apt-get install wxhexeditor
Тепер у шестигранному редакторі ви шукаєте 0f 84 e9 1e 00 00 і замінюєте його на 90 90 90 90 90 90 90. Якщо є лише одна частота 0f 84 e9 1e 00 00, і є, то це тривіально просто. Просто змініть байти в шістнадцяткові на 90 90 90 90 90 90 і збережіть. Готово. Kate або kwrite тепер відкриються, незалежно від того, ви root або ні.
якщо ви зробите те ж саме з дельфіном, ви зрозумієте, що objdump -Crd /usr/bin/dolhin
виробляються дуже короткі розбирання.
якщо ви запустите ldd /usr/bin/dolphin
, ви побачите, що дельфін завантажує спільну бібліотеку libkdeinit5_dolphin.so
linux-vdso.so.1 (0x00007ffc2fdf0000) libkdeinit5_dolphin.so => /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so (0x00007fb54e76c000)
Отже, ви зробите objdump на libkdeinit5_dolphin.so:
objdump -Crd /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so >> ~/libkdeinit5_dolphin.txt
Тепер відкрийте objdump: gedit ~/libkdeinit5_dolphin.txt
Шукайте getuid, і ви побачите, що одним із результатів пошуку є:
41f95: 31 c0 xor %eax,%eax
41f97: 89 7c 24 5c mov %edi,0x5c(%rsp)
41f9b: e8 50 b6 ff ff callq 3d5f0 <getuid@plt>
41fa0: 85 c0 test %eax,%eax
41fa2: 0f 84 58 1a 00 00 je 43a00 <kdemain@@Base+0x1a90>
41fa8: 48 8d 84 24 a0 00 00 lea 0xa0(%rsp),%rax
Це чудово, бачите, більше лайно, як у kate та kwrite.
Тепер відкрийте /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so
у своєму шестигранному редакторі, знайдіть 0f 84 58 1a 00 00
і замініть його 90 90 90 90 90 90
.
Натисніть зберегти, і зробіть.
Дельфін зараз працює як корінь.
Примітка. Хороша ідея зробити резервну копію файлів, які ви змінюєте, на всякий випадок, якщо ви зробите це.
Крім того, ви можете просто завантажити джерело kate, kwrite та дельфіна, видалити це лайно з вихідного коду, зібрати та встановити. Але оскільки в системі дурного cmake не вистачає шаленого шахрайського шаблону для дурного лайна, такого як іконки, можливо, тому що cmake, що постачається повторно, занадто старий, це не працює. Шкода, було б занадто просто, якби це просто працювало, чи не так.
Але просто виправлення виконуваних файлів, як я описав, швидше, тому кого все одно це хвилює.
Розумієте, це не прямо, але банально.
PS:
Тепер, коли будь-який час Kate, Kwrite або дельфін буде оновлено apt, ваші зміни будуть перезаписані. Вам потрібно буде застосувати їх повторно. Я залишаю автоматизувати патч-процес у ваших більш ніж здатних руках та вашій мові програмування веселощів;)
Чи можна це зробити в чистому стилі?
Крім того, якщо ви хочете виправити vlc за той самий лайн, ви можете зробити це за допомогою sed:
sed -i 's/geteuid/getppid/' /usr/bin/vlc
Просто покладіть цю заяву sed у сценарій, щоб ви могли повторно подати заявку, якщо вам це знадобиться, якщо ви офлайн і не маєте доступу в Інтернет.
Щасливе злому - з kate, kwrite та дельфіном - як root - під час перегляду / прослуховування чогось на vlc.
PS2:
шалені кореневі перевірки пройшли шлях Dodo в KDE v19.04.
Хто сказав, що російська еволюція була поганою справою.
До прогресу - ура!