Попытка конвертировать Perl в PHP

1

У меня возникли проблемы с преобразованием следующего кода из 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 в инструкции unpack, что происходит в части join, и что делает | md5sum | 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);

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

Теги:
pack
md5

2 ответа

2

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

<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 на каждом номере. Полученная строка затем используется aparameter при выполнении командной строки printf '$encstring' | md5sum printf '$encstring' | md5sum и возврат будет возвращен. Эффективно это возвращается с md5sum (как возвращается командой оболочки).

в качестве примера вызова функции с именем "username" в качестве параметра приведет к построению командной строки как printf '\165\163\145\162\156\141\155\145' | md5sum printf '\165\163\145\162\156\141\155\145' | md5sum который дает результат 14c4b06b824ec593239362517f538b29 - однако, если мы 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)

  • 1
    «Единственная причина для распаковки, объединения и печати - это обеспечить немного больше безопасности», может быть, но я думаю, что это слишком разрешает произвольные строки, включая те, которые включают одинарные кавычки и NUL. printf '\047\000' | hexdump -C
  • 0
    да - это имеет смысл - одиночная кавычка могла бы уничтожить командную строку - это не должно быть проблемой, которую нужно решать путем перевода php для использования функции md5sum, но она обеспечивает более вероятную интерпретацию первоначального намерения perl кодировщик.
Показать ещё 2 комментария
1

Очевидно, что у вашего 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 глыбы).

  • 0
    Спасибо! Я не могу поверить, что пропустил (), не уверен, как я это пропустил, кроме того, что было довольно поздно, когда я снова начал играть с этим. Также спасибо за разъяснения на упаковке!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню