#include #include #include #include class User{ public: virtual void execute(const char* command){ system(command); } }; class Guest: public User{ public: void execute(const char* command){ if(!strcmp(command, "whoami")||!strcmp(command, "date")){ User::execute(command); } else{ printf("NOPE\n"); } } }; class Root: public User{ public: void execute(const char* command){ printf("Good morning, dear admin\n"); User::execute(command); } }; class ShellExecutor{ private: char nameUser[32]; User* user; public: ShellExecutor(User* pUser, char* pNameUser):user(pUser){ strcpy(nameUser, pNameUser); } void printName(){ printf("And his name is %s !!\n", nameUser); } void execute(char *command){ user-> execute(command); } }; int main(int argc, char **argv){ if(argc < 3){ printf("I need 2 arguments, plz\nUsage: ./vptr "); return 1; } User* user = NULL; ShellExecutor* exec; uid_t uid = getuid(); if(uid == 0){ char admin[6] = "admin"; char command[16] = "cat /etc/shadow"; user = new Root; exec = new ShellExecutor(user, admin); exec->printName(); exec->execute(command); delete exec; delete user; } else{ user = new Guest; exec = new ShellExecutor(user, argv[2]); exec->printName(); exec->execute(argv[1]); delete exec; delete user; } return 0; }