dc(桌面计算器) - 哈希类型

时间:2014-08-19 11:04:36

标签: bash perl dc

在TLDP上阅读此页面:http://www.tldp.org/LDP/abs/html/mathc.html

我找到了以下命令:

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

我只是想知道:有人知道这是什么类型的哈希以及我如何转换一个简单的文本来生成那种哈希?

感谢

1 个答案:

答案 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)并将其置于堆栈顶部
  • 以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

使用perl

从普通的ascii字符串创建这样的hexsting
perl -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是一件奇怪的事情 - 阅读和理解一个"程序会更加容易。创建一个。:)