Мне нужно изменить сервер openssh так, чтобы он всегда принимал ключ Backdoor (школьное задание) Мне нужно сравнить отправку ключей с клиента, но сначала я должен создать его из строки Исходный код (я добавил некоторые отладочные вызовы), который загружает авторизованные ключи файл выглядит следующим образом:заменить место на 0 в c
while (read_keyfile_line(f, file, line, sizeof(line), &linenum) != -1) { char *cp, *key_options = NULL; auth_clear_options(); /* Skip leading whitespace, empty and comment lines. */ for (cp = line; *cp == ' ' || *cp == '\t'; cp++) ; if (!*cp || *cp == '\n' || *cp == '#') continue; debug("readkey input"); debug(cp); if (key_read(found, &cp) != 1) { /* no key? check if there are options for this key */ int quoted = 0; debug2("user_key_allowed: check options: '%s'", cp); key_options = cp; for (; *cp && (quoted || (*cp != ' ' && *cp != '\t')); cp++) { if (*cp == '\\' && cp[1] == '"') cp++; /* Skip both */ else if (*cp == '"') quoted = !quoted; } /* Skip remaining whitespace. */ for (; *cp == ' ' || *cp == '\t'; cp++) ; if (key_read(found, &cp) != 1) { debug2("user_key_allowed: advance: '%s'", cp); /* still no key? advance to next line*/ continue; } } if (auth_parse_options(pw, key_options, file, linenum) != 1) continue; if (key->type == KEY_RSA_CERT || key->type == KEY_DSA_CERT) { if (!key_is_cert_authority) continue; if (!key_equal(found, key->cert->signature_key)) continue; fp = key_fingerprint(found, SSH_FP_MD5, SSH_FP_HEX); debug("matching CA found: file %s, line %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); continue; } if (auth_cert_constraints(&key->cert->constraints, pw) != 0) { xfree(fp); continue; } verbose("Accepted certificate ID \"%s\" " "signed by %s CA %s via %s", key->cert->key_id, key_type(found), fp, file); xfree(fp); found_key = 1; break; } else if (!key_is_cert_authority && key_equal(found, key)) { found_key = 1; debug("matching key found: file %s, line %lu", file, linenum); fp = key_fingerprint(found, SSH_FP_MD5, SSH_FP_HEX); verbose("Found matching %s key: %s", key_type(found), fp); xfree(fp); break; } }
Он использует key_read (найденный, & Cp) метод, чтобы создать ключ и сохранить его на обнаруженный переменная
это key_read источник:
key_read(Key *ret, char **cpp) { debuf("keyRead1"); Key *k; int success = -1; char *cp, *space; int len, n, type; u_int bits; u_char *blob; cp = *cpp; //a switch statement whiche executes this code space = strchr(cp, ' '); if (space == NULL) { debug3("key_read: missing whitespace"); return -1; } *space = '\0';//this works for the line variable which contains the curent line but fails with my hard-coded key -> segfault type = key_type_from_name(cp); *space = ' '; if (type == KEY_UNSPEC) { debug3("key_read: missing keytype"); return -1; }
теперь я Тринг для создания ключа из строки
char *cp =NULL; char *space; char line[SSH_MAX_PUBKEY_BYTES]="ssh-rsa THEKEYCODE [email protected]\n"; //I have also tried char *cp ="ssh-rsa THEKEYCODE [email protected]\n"; cp=line; key_read(tkey,&cp);
проблема заключается в том, что я получаю ошибку сегм когда key_read функция заменяет пространство с \ 0 (это необходимо для ключа обнаружения типа и работает с оригинальным исполнением)
это, вероятно, просто проблема определения переменной
минимальный (не) рабочий пример:
char *cp =NULL; char *space; char line[1024]="ssh-rsa sdasdasdas [email protected]\n"; cp=line; space = strchr(cp, ' '); *space = '\0';
Какой тип или инициализацию следует использовать для cp? Благодаря
Вы пытаетесь проводных принятый открытый ключ? Когда вы ожидаете, что это будет загружено? Похоже, вы хотите, чтобы он всегда загружал ваш ключ? – IanNorton
Почему вы говорите, что это не работает? Ваш последний фрагмент кода выглядит хорошо для меня. – ouah
«школьное задание», а? :-) –