dc (настольный калькулятор) - тип хэшей

Чтение этой страницы в TLDP: http://www.tldp.org/LDP/abs/html/mathc.html

Я нашел следующую команду:

bash$ echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D68736142snlbxq" | dc
Bash

И мне было просто интересно: кто-то знает, что это за хэш, и как я могу преобразовать простой текст для генерации такого хэша?

Спасибо

1 ответ

Относительно хороший учебник здесь. Используя его, вы получите следующую декомпозицию:

  • 16i - ввод будет шестнадцатеричным (как в bc - ibase=16)
  • [q] - [..] средняя строка Так что этот магазин строки q на вершину стека. Обычно [....] представляет собой серию команд, сохраненных для последующего выполнения (например, макрос), в данном случае команда q - уволиться.
  • s - возьмите вершину стека и сохраните ее для регистрации, обозначенной следующей буквой, так что [q]sa вместе в этом случае означает: сохранить строку q в реестр a
  • то же самое со следующим, сохранить строку ln0=aln100%Pln100/snlbx в реестр b
  • следующий A0D68736142sn, хранить A0D68736142 в реестр n, В этом случае не строка, а потому что мы введем шестнадцатеричный ввод, это шестнадцатеричное число

Выше приведен этап подготовки, переведенный на общий язык программирования:

$a = "q";
$b = "ln0=aln100%Pln100/snlbx";
$n = 0xA0D68736142";

Стек теперь пуст (все хранится в регистрах).

Следующим является окончательный расчет:

  • l значит, взять значение из последующего регистра и поместить его в верхнюю часть стека, чтобы lb значит: взять значение регистра b,
  • x значит: выполнить его как последовательность команд - в этом случае читать как eval "$b";
  • последний q значит бросить

теперь нужно разложить ln0=aln100%Pln100/snlbx (содержание реестра b - что такое.)

  • ln- как указано выше, взять значение из регистраnв нашем случае: гекса-число
  • следующая сложная часть:0=aвозьмите вершину стека, и если этоzeroвыполнить строку (макрос), хранящуюся в реестре "a" (в нашем случае это "q" - выход), например:
if( $n == 0 ) eval "a"; #a contains "q" = quit
  • если$nне ноль, взять содержимое регистратораnснова (ln) (положить на вершину стека)
  • поставить номер100(это гекса) к вершине стека
  • %по модулю два числа из верхней части стека (так:$n % 0x100) и положить его на вершину стека
  • вывести верхнюю часть стека в виде строки ascii (chr($stack))
  • lnвозьми снова номер$n(опять же, доходит до вершины стека)
  • положил100в стек
  • /разделить на числа в стеке (результат попадает в начало)
  • snхранить стек в$n(заменяет оригинальный номер)
  • lbx- как указано выше - проверить регистр b

Итак, вкратце:

  • из числа0xA0D68736142Хранится в$n,
  • по модулю0x100получить последние две цифры, преобразовать их в ascii и распечатать,
  • разделить это на0x100(удаляет последние две цифры) и сохраняет его в$n
  • повторять, пока ничего не осталось (ноль)

Для0xA0D68736142вы получите (используйтеman ascii)

  • 42-B
  • 61-a
  • 73-s
  • 68-h
  • 0D-\r
  • A(как 0A) -\n

Создание такого гексстинга из обычной строки ascii с помощью perl

perl -E '$s=reverse("Bash\r\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'

печать

0A0D68736142

или же

perl -E '$s=reverse("Stackru rocks\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'

0A736B636F7220776F6C667265766F6B63617453

а также

echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sb0A736B636F7220776F6C667265766F6B63617453snlbxq" | dc

печатает:

Stackru rocks

Ps: сdcОдна странная вещь - намного проще читать и понимать "программу" как ее создание.:)

Другие вопросы по тегам