在TLDP上阅读此页面:http://www.tldp.org/LDP/abs/html/mathc.html
我找到了以下命令:
bash$ echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D68736142snlbxq" | dc
Bash
我只是想知道:有人知道这是什么类型的哈希以及我如何转换一个简单的文本来生成那种哈希?
感谢
答案 0 :(得分:4)
相对较好的教程是here。使用它,您将获得下一个分解:
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
的内容 - 什么是 eval -ing。)
ln
- 如上所述,在我们的案例中,从寄存器n
中获取值:hexa-number 0=a
,取堆栈的顶部,如果是zero
,则执行存储在注册表中的字符串(宏)" a" (在我们的例子中,这是" q" - 退出),例如像:if( $n == 0 ) eval "a"; #a contains "q" = quit
$n
不为零,请再次使用注册人n
的内容(ln
)(置于堆栈顶部)100
(它是hexa)放到堆栈顶部%
以模块顶部的两个数字为模(所以:$n % 0x100
)并将其置于堆栈顶部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
使用perl
从普通的ascii字符串创建这样的hexstingperl -E '$s=reverse("Bash\r\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'
打印
0A0D68736142
或
perl -E '$s=reverse("Stackoverflow rocks\n");$s =~ s/(.)/sprintf("%02x",ord($1))/seg;say uc $s'
0A736B636F7220776F6C667265766F6B63617453
和
echo "16i[q]sa[ln0=aln100%Pln100/snlbx]sb0A736B636F7220776F6C667265766F6B63617453snlbxq" | dc
打印:
Stackoverflow rocks
Ps:dc
是一件奇怪的事情 - 阅读和理解一个"程序会更加容易。创建一个。:)