c-在__GI___strdup()中与SIGSEGV崩溃



我编写代码从xml文件读取并打开myapp配置。代码试图解析文件中的关键元素,并在它们不存在的情况下创建它们:

static xmlDocPtr configsave_open( const char *config_filename )
{
    xmlDocPtr doc;
    xmlNodePtr top;
    int create_file = 0;
    doc = xmlParseFile( config_filename );
    ......................................
    xmlKeepBlanksDefault( 0 );
    if( create_file ) {
        char *temp = strdup( config_filename ); /* <-- crashed with SIGSEGV in __GI___strdup() */
        if( ! temp ) {
            fprintf( stderr, "strdup failed for config_filename %sn", config_filename );
            xmlFreeDoc( doc );
            return 0;
        }
        mkdir_and_force_owner( dirname( temp ), getuid(), getgid() );
        free( temp );
    }
    ......................................
    return doc;
}

我写测试用例:

#!/bin/bash
# seed id: 16154
DIR="$( cd "$( dirname "$0" )" && pwd )"
GDB=
if [ "$1" = "-g" ]
then
    GDB="gdb --args"
fi
env -i 
    MALLOC_CHECK_=0 
    $GDB 
/usr/bin/myapp 
    "`cat $DIR/argv_1.symb`" 
    "`cat $DIR/argv_2.symb`" 
    
    < "$DIR/file___dev__stdin.symb"
exit_code=$?
exit $exit_code

其中argv_2.symb文件包含:

'`

和文件__dev_stdin.symb包含:

AAAAAAAAAAAAAAAAAAAAAAAA

崩溃输出:

I/O warning : failed to load external entity "NULL"
./exploit.sh: line 19:  7175 Segmentation fault
(core dumped)
env -i MALLOC_CHECK_=0 $GDB /usr/bin/myapp "`cat $DIR/argv_1.symb`" "`cat $DIR/argv_2.symb`" < "$DIR/file___dev__stdin.symb"

尝试使用配置文件args:运行myapp时基本崩溃

/usr/bin/myapp --configfile '`

任何解决此问题的帮助都欢迎

我认为config_filename在这里可能是NULL,特别是考虑到以下消息:

I/O warning : failed to load external entity "NULL"

如果不是这样,我们可能需要更多的背景。

最新更新