0

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

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 回答