0

常にバックドアキーを受け入れるようにopensshサーバーを変更する必要があります(学校の割り当て)クライアントから送信されたキーを比較する必要がありますが、最初に文字列から作成する必要があります元のコード(いくつかのデバッグ呼び出しを追加しました)許可されたキーファイルをロードするのは次のようになります。

while(read_keyfile_line(f、file、line、sizeof(line)、&linenum)!= -1){
        char * cp、* key_options = NULL;

        auth_clear_options();

        / *先頭の空白、空、コメント行をスキップします。* /

        for(cp = line; * cp =='' || * cp =='\ t'; cp ++)
            ;
        if(!* cp || * cp =='\ n'|| * cp =='#')
            継続する;
        debug( "readkey input");
        debug(cp);
        if(key_read(found、&cp)!= 1){
            / *キーがありませんか?このキーのオプションがあるかどうかを確認してください*/
            int quoted = 0;
            debug2( "user_key_allowed:オプションを確認してください:'%s'"、cp);
            key_options = cp;
            for(; * cp &&(quoted ||(* cp!='' && * cp!='\ t')); cp ++){
                if(* cp =='\\' && cp [1] =='"')
                    cp ++; /*両方をスキップします*/
                else if(* cp =='"')
                    quoted =!quoted;
            }
            /*残りの空白をスキップします。* /
            for(; * cp =='' || * cp =='\ t'; cp ++)
                ;
            if(key_read(found、&cp)!= 1){
                debug2( "user_key_allowed:advance:'%s'"、cp);
                / *まだキーがありませんか?次の行に進む*/
                継続する;
            }
        }
        if(auth_parse_options(pw、key_options、file、linenum)!= 1)
            継続する;
        if(key-> type == KEY_RSA_CERT || key-> type == KEY_DSA_CERT){
            if(!key_is_cert_authority)
                継続する;
            if(!key_equal(found、key-> cert-> signature_key))
                継続する;
            fp = key_fingerprint(found、SSH_FP_MD5、
                SSH_FP_HEX);
            debug( "一致するCAが見つかりました:ファイル%s、行%lu、%s%s"、
                file、linenum、key_type(found)、fp);
            if(key_cert_check_authority(key、0、0、pw-> pw_name、
                &reason)!= 0){
                xfree(fp);
                error( "%s"、reason);
                auth_debug_add( "%s"、reason);
                継続する;
            }
            if(auth_cert_constraints(&key-> cert->制約、
                pw)!= 0){
                xfree(fp);
                継続する;
            }
            verbose("受け入れられた証明書ID\"%s \ ""
                "%s経由で%s CA%sによって署名されました"、key-> cert-> key_id、
                key_type(found)、fp、file);
            xfree(fp);
            found_key = 1;
            壊す;
        } else if(!key_is_cert_authority && key_equal(found、key)){
            found_key = 1;
            debug( "一致するキーが見つかりました:ファイル%s、行%lu"、
                ファイル、linenum);
            fp = key_fingerprint(found、SSH_FP_MD5、SSH_FP_HEX);
            verbose( "一致する%sキーが見つかりました:%s"、
                key_type(found)、fp);
            xfree(fp);
            壊す;
        }
    }

key_read(found、&cp)メソッドを使用してキーを作成し、見つかった変数に保存します

これはkey_readソースです:

key_read(Key * ret、char ** cpp)
{{
    debuf( "keyRead1");
    キー*k;
    int success = -1;
    char * cp、* space;
    int len、n、type;
    u_intビット;
    u_char * blob;

    cp = * cpp;
//このコードを実行するswitchステートメント
        スペース=strchr(cp、'');
        if(space == NULL){
            debug3( "key_read:空白がありません");
            -1を返します。
        }

        * space ='\ 0'; //これは、現在の行を含む行変数に対して機能しますが、ハードコードされたキーで失敗します-> segfault
        type = key_type_from_name(cp);
        *スペース='';
        if(type == KEY_UNSPEC){
            debug3( "key_read:キータイプがありません");
            -1を返します。
        }

文字列からキーを作成しようとしています

char * cp = NULL;
    char * space;
    char line [SSH_MAX_PUBKEY_BYTES] = "ssh-rsa THEKEYCODE xx @ example \ n";
// char * cp = "ssh-rsa THEKEYCODE xx @ example\n";も試しました

cp = line;
key_read(tkey、&cp);


問題は、key_read関数がスペースを\ 0に置き換えると、セグメンテーション違反が発生することです(これは、キータイプの検出に必要であり、元の実行で機能します)

おそらく単なる変数定義の問題です

最小限の(機能しない)例:

    char * cp = NULL;
    char * space;
    char line [1024] = "ssh-rsa sdasdasdas asd @ sdasd \ n";

cp = line;


    スペース=strchr(cp、'');

        *スペース='\0';


cpにはどのタイプまたは初期化を使用する必要がありますか?ありがとう

4

1 に答える 1

0

これは正常に実行され、私にとっては期待どおりです。

#include<stdio.h>

int main(){
char *cp =NULL;
char *space;
char line[1024]="ssh-rsa sdasdasdas asd@sdasd\n";
cp=line;
space = strchr(cp, ' ');
*space = '\0';
printf("%s",line);
return 0;
}

Output: ssh-rsa
于 2012-05-06T21:04:57.533 に答える