我必须修改 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 使用什么类型或初始化?谢谢