当我偶然发现这个时,我正在浏览一个有趣的UNIX命令列表:
$ echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
GET A LIFE!
Run Code Online (Sandbox Code Playgroud)
我从来没有读过关于dc命令的内容,所以我浏览了Wiki页面并设法学会做一些小事情:
$ echo "4 5 + p" | dc
9
$ echo "2 10 ^ p" | dc
1024
Run Code Online (Sandbox Code Playgroud)
但是,这个命令[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq听起来对我来说太过分了.有没有办法让它以一种可以理解的方式解释(让我的生活回归)?
......这个命令
[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq对我来说太过分了.有没有办法让它以可理解的方式解释......
相关部分man dc:
输入一个数字会将其推送到堆栈中.
- [ 人物]
- 创建一个包含字符的字符串(包含在平衡[和]字符之间),并将其推送到堆栈中.
- s r
- 将值从堆栈顶部弹出并将其存储到寄存器r中.
- l r
- 复制寄存器r中的值并将其推入堆栈.
- X
- 从堆栈中弹出一个值并将其作为宏执行.
- = r
- 从堆栈中弹出两个值并假设它们是数字来比较它们,如果弹出的两个数字相等,则将寄存器r的内容作为宏执行.
- /
- 弹出两个值,将弹出的第二个值与弹出的第一个值分开,然后推送结果.
- %
- 弹出两个值,计算/命令将执行的除法的余数,然后推送它.
- P
- 弹出堆栈顶部的值.如果它是一个字符串,它只是打印没有尾随换行符.否则它是一个数字,并且其绝对值的整数部分被打印为"基础(UCHAR_MAX + 1)"字节流.
- q
- 退出宏,也退出调用它的宏.如果从顶层调用,或从直接从顶层调用的宏调用, q命令将导致dc退出.
所以,
[q]sa将字符串存储q到寄存器中a.[ln0=aln256%Pln256/snlbx]sb将字符串存储ln0=aln256%Pln256/snlbx到寄存器中b.3135071790101768542287578439sn将号码3135071790101768542287578439存入n.lbxln0=aln256%Pln256/snlbx从寄存器执行字符串b.ln0=a如果n等于零,则执行q来自寄存器的字符串a,即从宏退出.ln256%P打印输出字节nmod 256,在第71位,即ASCII G.ln256/sn除以n256,从而切断最后一个字节.lbxln0=aln256%Pln256/snlbx从寄存器中重复执行字符串b.重复执行会E T A L I F E ! \n连续产生ASCII字节.在UNIX有趣的东西 - 回声和直流 - 混淆/乱码字符串类型你可以找到混淆这样的字符串的脚本,以及如何使用它的解释:
如果将以下脚本保存在名为obfuscate的文件中:
Run Code Online (Sandbox Code Playgroud)#!/bin/ksh # NAME: obfuscate -- obfuscate text read from one or more files into a # string that can be decrypted by the dc utility # # SYNOPSIS: obfuscate file... # # OPERANDS: file The name of a text file containing text to be # obfuscated or "-" to obfuscate text read from # standard input. # # APPLICATION USAGE: # To decrypt the obfuscated string produced by obfuscate, use: # obfuscate file | read string # Get obfuscated text # Note: Do not use "read -r string" in the above command! # printf '%s\n' "$string" # Show obfuscated text # echo "$string" | dc # Decrypt obfuscated text # # Although dc can produce artibrary length output, feeding the objuscated # string back into dc for decryption may be limited by {LINE_MAX} and/or # {ARG_MAX} restrictions. # Initialize a to ASCII character set (skipping NUL)... a='\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17\20\21\22\23\24\25\26\27\30\31\32\33' a="$a"'\34\35\36\37 !"#$%&'"'"'()*+,-./0123456789:;<=>?@' a="$a"'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\377' awk -v A="$a" ' function cline(inline, i) { printf("256*%d+\n", index(A, "\n")) for(i = length(inline); i; i--) { printf("256*%d+\n", index(A, substr(inline, i, 1))) } } BEGIN { print 0 } { line[NR] = $0 } END { for(i = NR; i; i--) cline(line[i]) printf("[[q]sa[ln0=aln256%%Pln256/snlbx]sb]Pn[snlbxq\n]Pq\n") }' "$@" | tee .dc_input | dc使其可执行:
Run Code Online (Sandbox Code Playgroud)chmod +x obfuscate并执行命令:
Run Code Online (Sandbox Code Playgroud)printf "Hello World.\nAre we there yet?\nLet's go home, now!\n" | ./obfuscate - | read string那么命令:
Run Code Online (Sandbox Code Playgroud)echo "$string"会给你:
Run Code Online (Sandbox Code Playgroud)[q]sa[ln0=aln256%Pln256/snlbx]sb26160072918627741401952510855241017735603346265259888938898171600856988789569756293233903076568696999873394858335331444040snlbxq和命令:
Run Code Online (Sandbox Code Playgroud)echo "$string"|dc会给你:
Run Code Online (Sandbox Code Playgroud)Hello World. Are we there yet? Let's go home, now!(...)如果不能使用不在7位ASCII字符集中的字符,如果要混淆的文本包含任何NUL字节,它将无法工作,并且在许多系统上它不会如果要混淆的文件中的行长于LINE_MAX字节,并且如果obfuscate生成的输出生成的字符串长于LINE_MAX,则dc可能无法在某些系统上为您解密.