Попытка конвертировать Perl в стек переполнения

У меня проблемы с преобразованием следующего кода из Perl в PHP. В частности, у меня возникли проблемы с этим разделом, так как я понятия не имею, что здесь происходит:

sub md5sum($) {
my @ib = unpack("C*", shift);
my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
my ($out) = split(/ /, `printf '$encstr' | md5sum`);
return $out;
}

Главное, на что я обращаюсь за помощью, это то, что "C*", shift сделать в распаковке, что происходит в join часть, и что делает | md5sum сделать в конце split

В этом разделе ниже, я думаю, у меня тоже проблемы. Мой главный вопрос здесь для пакета php, я указываю H32, или просто H?

$hexchal = pack "H32", $challenge;
$newchal = pack "H32", md5sum($hexchal . $uamsecret);
my $passvar = "";
$passvar = md5sum("\0" . $password . $newchal);

Вот то, что я пробовал в разделе выше, но $ hexchal не совпадают

$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret);
$passvar = md5("\0".$password.$newchal);

В любом случае, любая помощь будет принята с благодарностью!

1

Решение

Код выглядит немного смущающим для меня, но вот моя интерпретация:

<1> sub md5sum($) {
<2>   my @ib = unpack("C*", shift);
<3>   my $encstr = join("", map {sprintf('\%3.3o', $_)} @ib);
<4>   my ($out) = split(/ /, `printf '$encstr' | md5sum`);
<5>   return $out;
}

"C*", shift на <2> преобразует строку в массив чисел, который затем объединяется для формирования новой строки, выполняя форматирование sprintf для каждого числа. Результирующая строка затем используется в качестве параметра при выполнении командной строки printf '$encstring' | md5sum и возвращение захватывается и возвращается. Эффективно это возвращается с md5sum (как возвращено командой shell).

в качестве примера вызов функции с именем пользователя в качестве параметра приведет к тому, что командная строка будет построена как printf '\165\163\145\162\156\141\155\145' | md5sum который дает результат 14c4b06b824ec593239362517f538b29 - однако, если мы отбросим переданную по каналу md5sum и просто выполним printf '\165\163\145\162\156\141\155\145' в оболочке мы получаем исходную строку «username».

Мне кажется, что единственная причина для распаковки, объединения и печати — это обеспечить немного больше безопасности, чтобы процессы не содержали исходную строку, если кто-нибудь взломает машину и будет наблюдать за процессами и т. Д.

Разделение на пробел, по-видимому, используется для пропуска завершающего символа, возвращаемого вызовом командной строки, так что вы можете получить md5sum только путем разбиения перезаписанной строки из командной строки на 2 значения, но только захвата первого в возвращенный скаляр $ out переменная.

Я предполагаю, что автор кода не смог использовать модуль CPAN MD5 и поэтому вернулся к использованию команды md5sum из командной строки, но хотел запутать и вызовы командной строки.

Вы должны иметь возможность заменить всю функцию вызовом функции php md5sum, используя только строку в качестве параметра ( http://php.net/manual/en/function.md5.php )

2

Другие решения

В вашем PHP-коде явно отсутствует вызов pack, Пытаться:

$hexchal = pack("H32", $challenge);
$newchal = pack("H32", md5($hexchal.$uamsecret));
$passvar = md5("\0".$password.$newchal);

Кроме того, вы можете установить raw_output параметр PHP md5 функция к TRUE:

$hexchal = pack("H32", $challenge);
$newchal = md5($hexchal.$uamsecret, TRUE);
$passvar = md5("\0".$password.$newchal);

Вы должны использовать "H32" в PHP так же, как в Perl. Оно говорит pack ожидать 16 байтов (32 клева).

1

По вопросам рекламы [email protected]