4

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

我找到了以下命令:

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

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

谢谢

4

1 回答 1

4

比较好的教程在这里。使用它,您将获得下一个分解:

  • 16i- 输入将是十六进制(如bc- ibase=16
  • [q]-[..]平均字符串。所以这会将一个字符串存储q到堆栈的顶部。通常[....]是存储以供以后执行的一系列命令(如),在这种情况下是命令q- 退出。
  • s- 取栈顶并将其存储到由下一个字母标识的寄存器中,所以在[q]sa这种情况下,一起意味着:将字符串存储q到寄存器中a
  • 与下一个相同,将字符串存储ln0=aln100%Pln100/snlbx到寄存器中b
  • 接下来A0D68736142sn,将 intA0D68736142存入寄存器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获取 regsiter 的内容( ) (放入堆栈顶部)nln
  • 将数字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

用 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:withdc是一件奇怪的事情——在创建一个“程序”时,它更容易阅读和理解。:)

于 2014-08-19T12:27:46.393 回答