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