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
Одна странная вещь - намного проще читать и понимать "программу" как ее создание.:)