我必须修改 openssh 服务器,使其始终接受后门密钥(学校作业) 我需要比较从客户端发送的密钥,但首先我必须从字符串创建它 原始代码(我添加了一些调试调用)加载授权密钥文件如下所示:
while (read_keyfile_line(f, file, line, sizeof(line), &linenum) != -1) {
字符 *cp, *key_options = NULL;
auth_clear_options();
/* 跳过前导空格、空行和注释行。*/
for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
;
if (!*cp || *cp == '\n' || *cp == '#')
继续;
debug("readkey 输入");
调试(cp);
if (key_read(found, &cp) != 1) {
/* 没有钥匙?检查此键是否有选项 */
int 引用 = 0;
debug2("user_key_allowed: 检查选项: '%s'", cp);
key_options = cp;
for (; *cp && (引用 || (*cp != ' ' && *cp != '\t')); cp++) {
if (*cp == '\\' && cp[1] == '"')
cp++; /* 跳过两者 */
否则 if (*cp == '"')
引用=!引用;
}
/* 跳过剩余的空格。*/
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) {
如果(!key_is_cert_authority)
继续;
if (!key_equal(找到,key->cert->signature_key))
继续;
fp = key_fingerprint(找到,SSH_FP_MD5,
SSH_FP_HEX);
debug("找到匹配的 CA:文件 %s,行 %lu,%s %s",
文件,linenum,key_type(找到),fp);
if (key_cert_check_authority(key, 0, 0, pw->pw_name,
&reason) != 0) {
xfree(fp);
错误(“%s”,原因);
auth_debug_add("%s", 原因);
继续;
}
if (auth_cert_constraints(&key->cert->constraints,
pw) != 0) {
xfree(fp);
继续;
}
verbose("接受的证书 ID \"%s\" "
"由 %s CA %s 通过 %s 签名", key->cert->key_id,
key_type(找到),fp,文件);
xfree(fp);
found_key = 1;
休息;
} else if (!key_is_cert_authority && key_equal(found, key)) {
found_key = 1;
debug("找到匹配键:文件 %s,行 %lu",
文件,行号);
fp = key_fingerprint(找到,SSH_FP_MD5,SSH_FP_HEX);
verbose("找到匹配的 %s 键:%s",
key_type(找到), fp);
xfree(fp);
休息;
}
}
它使用 key_read(found, &cp) 方法创建密钥并将其保存到 found 变量
这是 key_read 来源:
key_read(Key *ret, char **cpp)
{
debuf("keyRead1");
键*k;
诠释成功 = -1;
字符 *cp, *space;
int len,n,类型;
u_int 位;
u_char *blob;
cp = *cpp;
//执行此代码的switch语句
空间 = strchr(cp, ' ');
如果(空格== NULL){
debug3("key_read: 缺少空格");
返回-1;
}
*space = '\0';//这适用于包含当前行但因我的硬编码密钥而失败的行变量-> segfault
类型 = key_type_from_name(cp);
*空格='';
如果(类型 == KEY_UNSPEC){
debug3("key_read: 缺少 keytype");
返回-1;
}
现在我想从一个字符串创建一个键
字符 *cp =NULL;
字符 *空格;
字符行[SSH_MAX_PUBKEY_BYTES]="ssh-rsa THEKEYCODE xx@example\n";
//我也试过 char *cp ="ssh-rsa THEKEYCODE xx@example\n";
cp=线;
key_read(tkey,&cp);
问题是当 key_read 函数用 \0 替换空格时出现段错误(这是键类型检测所必需的,并且适用于原始执行)
这可能只是一个变量定义问题
一个最小(不)工作的例子:
字符 *cp =NULL;
字符 *空格;
字符线[1024]="ssh-rsa sdasdasdas asd@sdasd\n";
cp=线;
空间 = strchr(cp, ' ');
*空格 = '\0';
我应该为 cp 使用什么类型或初始化?谢谢