Godt nu har jeg et program der virker:
Kode: Vælg alt
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <error.h>
int main(void)
{
char *sti_til_program_med_filnavn = "/usr/bin/whoami";
char *args[] = {sti_til_program_med_filnavn, (char *) 0 };
if (-1 == (seteuid( ((uid_t)0) )))
{
perror("FATAL ERROR: cannot switch effective uid to 0 (root)");
exit(-1);
}
/* success! seteuid had been changed to 0 */
if (-1 == (execv(sti_til_program_med_filnavn, args)))
{
perror("FATAL ERROR: cannot start the application");
exit(-2);
}
/* Hvis execv er succesful, returneres der ikke til programmet, da
dette program erstattes fuldstændigt af det program der kaldes.
For at gøre compileren glad ... */
exit(0);
}
Det der får den til er virke er seteuid(0) kaldet, der er også tilføjet fejlhåndtering.
Hvis programmet er set uid root: skriver den
root
når jeg kører programmet uden sudo.
Hvis ikke den er set uid root, og jeg kører uden sudo, så skriver den i stedet:
FATAL ERROR: cannot switch effective uid to 0 (root): Operation not permitted
Ja, det er en bruger-uvenlig fejlmeddelelse, men du kan da rette den fra:
Kode: Vælg alt
perror("FATAL ERROR: cannot switch effective uid to 0 (root)");
til
Kode: Vælg alt
perror("Programmet er ikke set uid root, og kan derfor ikke afvikle et program med superbrugerrettigheder, med mindre man bruger sudo foran dette program");
før du oversætter programmet til noget din mikroprocessor kan forstå.
Du skal iøvrigt nu oversætte med denne kommando:
Kode: Vælg alt
gcc -Wall -O2 -lc -o rwhoami rwhoami.c
Kommentar til oversættelses kommandoen:
- rwhoami.c fordi det var hvad jeg kalde min c kode fil, du kan bruge et andet.
- rwhoami argumentet til -o optionen (-o rwhoami) behøver ikke at have samme filnavn som for c filen, du kunne kalde programmet fmount f.eks, altså erstatte -o rwhoami med -o fmount
/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og
indlejede systemer, hvor indlejrede systemer
er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags