常にバックドアキーを受け入れるように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にはどのタイプまたは初期化を使用する必要がありますか?ありがとう