To banalne!
Wystarczy spojrzeć na kod źródłowy Kate i Kwrite:
diff --git a/kate/main.cpp b/kwrite/main.cpp
W pierwszych wierszach kodu bezpośrednio na początku funkcji „głównej” znajdziesz:
/**
* 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;
}
Delfin nie jest inny, z wyjątkiem tego, co dzieje się w libkdeinit5_dolphin.so.
Więc uruchamianie jako root jest banalne, wystarczy, że pomiń sprawdzanie if uid = 0.
Sposób, w jaki to robimy, polega na łączeniu kate, kwrite i delfina z perma.
Pierwszą rzeczą, którą robimy, jest zrzut zawartości binarnej do pliku tekstowego:
objdump -Crd /usr/bin/kate >> ~/kate.txt
objdump -Crd /usr/bin/kwrite >> ~/kwrite.txt
Teraz możesz spojrzeć na plik za pomocą gedit ~/kate.txt
, a jeśli szukasz getuid, znajdziesz coś takiego:
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>
Teraz po lewej stronie znajduje się adres pamięci, po dwukropku (:) zobaczysz kod instrukcji binarnej (hex), a po prawej stronie zobaczysz dezasemblację tego kodu (czyli co to znaczy) .
Teraz widzisz, tam wywołuje getuid, sprawdza, czy jest to zero i przeskakuje do instrukcji if, to znaczy, czy zwracana wartość jest równa zero (je: jump if if).
Teraz nie chcemy wskakiwać do if, więc po prostu usuwamy te badziewia. Ale samo usunięcie tego badziewia zmieniłoby adresy o 6 bajtów, niszcząc wszelkie względne skoki w programie w procesie, aw konsekwencji program. Więc zamiast po prostu zastąpić całą długość rachunku skoku z NOP (skrót N ö op chłodnika) instrukcje, aka 0x90 w instrukcji / kod hex.
Musisz więc zastąpić każdy bajt skoku tam 0x90, tak jak poprzednio
0f 84 e9 1e 00 00
będziesz miał
90 90 90 90 90 90
Można to zrobić po prostu za pomocą edytora szesnastkowego.
Więc instalujemy jeden:
sudo apt-get install wxhexeditor
Teraz w edytorze szesnastkowym wyszukujesz 0f 84 e9 1e 00 00 i zamieniasz je na 90 90 90 90 90 90 90. Jeśli jest tylko jedno wystąpienie 0f 84 e9 1e 00 00 i jest, to jest to banalnie proste. Po prostu zmień bajty szesnastkowe na 90 90 90 90 90 90 i zapisz. Skończone. Kate lub kwrite otworzą się teraz, bez względu na to, czy jesteś rootem, czy nie.
jeśli zrobisz to samo z delfinem, zdasz sobie sprawę, że objdump -Crd /usr/bin/dolhin
powoduje bardzo krótki demontaż.
jeśli uruchomisz ldd /usr/bin/dolphin
, zobaczysz, że delfin ładuje bibliotekę współdzieloną libkdeinit5_dolphin.so
linux-vdso.so.1 (0x00007ffc2fdf0000) libkdeinit5_dolphin.so => /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so (0x00007fb54e76c000)
Więc robisz objdump na libkdeinit5_dolphin.so:
objdump -Crd /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so >> ~/libkdeinit5_dolphin.txt
Teraz otwórz objdump: gedit ~/libkdeinit5_dolphin.txt
Wyszukaj getuid, a zobaczysz, że jeden z wyników wyszukiwania to:
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
Widzisz, jest to świetne bzdury, tak jak w przypadku Kate i Kwrite.
Teraz otwórz /usr/lib/x86_64-linux-gnu/libkdeinit5_dolphin.so
w edytorze szesnastkowym, wyszukaj 0f 84 58 1a 00 00
i zamień na 90 90 90 90 90 90
.
Naciśnij Zapisz i gotowe.
Dolphin działa teraz jako root.
Uwaga: dobrym pomysłem jest utworzenie kopii zapasowej modyfikowanych plików, na wypadek, gdybyś się pieprzył.
Możesz także pobrać źródło Kate, Kwrite i Dolphin, usunąć te bzdury z kodu źródłowego, skompilować i zainstalować. Ale ponieważ w głupim systemie cmake brakuje jakiegoś gównianego badziewia dla jakiegoś głupiego badziewia, takiego jak ikony, prawdopodobnie dlatego, że cmake dostarczany przez repozytorium jest za stary, to nie działa. Szkoda, byłoby zbyt proste, gdyby po prostu działało, prawda?
Ale łatanie plików wykonywalnych, tak jak to opisałem, jest szybsze, więc kogo to obchodzi.
Widzisz, to nie jest proste, ale jest banalne.
PS:
Teraz, za każdym razem, gdy Kate, Kwrite lub Delfin są aktualizowane przez apt, twoje zmiany zostaną nadpisane. Musisz je ponownie zastosować. Opuszczę automatyzację procesu łatania w twoich więcej niż zdolnych rękach i twoim języku programowania joice;)
Czy można to zrobić w czystym stylu?
Ponadto, jeśli chcesz załatać VLC dla tego samego badziewia, możesz to zrobić za pomocą sed:
sed -i 's/geteuid/getppid/' /usr/bin/vlc
Wystarczy umieścić tę instrukcję sed w skrypcie, abyś mógł ją ponownie złożyć, jeśli zajdzie taka potrzeba, jeśli jesteś offline i nie masz dostępu do Internetu.
Szczęśliwego hakowania - z Kate, Kwrite i delfinem - jako rootem - podczas oglądania / słuchania czegoś na VLC.
PS2:
Wstrętne kontrole rootów poszły w kierunku Dodo w KDE v19.04.
Kto powiedział, że n ewolucja było złe.
Do postępu - Pozdrawiam!