Wiem, że użycie polecenia „chroot” w Linuksie wymaga plików lub katalogów, takich jak usr
, bin
i tak dalej. Ale kiedy używam funkcji chroot()
w C potrzebuję tych plików?
Oto mój kod, który „hw.out” jest plikiem binarnym, który po prostu wypisuje „Hello, world”. Skompilowałem go i uruchomiłem jako root, ale nie udało się wydrukować „Hello, world”. Co jeszcze powinienem zrobić? Dziękuję Ci!
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int result = chroot(".");
if(result == 0)
printf("Chroot Succese.n");
char *arrays[]={"./hw.out",NULL};
execvp("./hw.out", arrays);
return 0;
}
Odpowiedzi:
4 dla odpowiedzi № 1execvp
najprawdopodobniej zawodzi, prawdopodobnie z ENOENT: no such file or directory
, gdyby hw.out
to dynamicznie połączony plik wykonywalny.
Aby to działało, wszystkie biblioteki wymagane przez hw.out
muszą być dostępne w chroot
ed środowisko.
Spróbuj połączyć hw.out
statycznie i powinno działać. (I dodaj błąd sprawdzania po execvp
zobaczyć co errno
jest ustawiany po zakończeniu połączenia, jeśli powróci.)
1 dla odpowiedzi nr 2
Sprawdź, czy twój hw.out
działa z chroot linii poleceń.
Być może hw.out jest dynamicznie połączony i brakuje niektórych bibliotek lub ld-linux.so
w katalogu chroot.
Nitpicks 1, o co chodzi return 0
po execvp? nigdy nie zostanie wykonany, chyba że wystąpi błąd. wolałbym mieć perror("can"t exec"); return 1;
Nitpick 2, chroot () nie zmienia katalogu roboczego, chociaż działa w twoim przypadku, ponieważ chrootujesz na "."
, nie zadziała tak, jak się spodziewasz, jeśli później zmienisz go na chroot („somedir”).
0 dla odpowiedzi № 3
Upewnić się, że hw.out jest we właściwej linii. Być może łatwiej jest mieć statyczne połączenie, jeśli używa bibliotek. W przeciwnym razie należy włączyć po chroot, aby mógł uzyskać dostęp do dynamicznych bibliotek.