一道很锻炼脚本能力的小题(包括正则,文件处理,字符串处理等)
0X00 前言
事情的起因是这学期开始的时候 XDSEC 招新,本来是交给大一的学弟学妹们出题运维的,但是我还是突发奇想的出了一个比较有趣的脚本题,难度并不是很大,但是很多东西都考到了,感觉很锻炼能力,意图也是让新生们学习一下脚本语言。当时题目一出来解的方法也非常多有用 C++ 的,有用 python 的,还有一个外校来交流的师傅用的是 shell 脚本。。。当然我是最奇葩的,我用的是 bat 脚本,因为当时正巧在看一些关于 bat 的东西,还写了这篇文章,现在学期快结束了,我又想起来了这个东西,因为之前和那位外校师傅交流立了 flag 说要自己也写一个 shell 脚本的版本,于是现在来填坑啦!
0X01 题目介绍
题目名称:想去BAT?先过我这关!
本题你可以看到一共有50个文件夹,每个文件夹内有一个与文件夹同名的txt文档,每个文档里面有若干由随机数字和短横线组成的字符串。
如图所示:
flag如何获取?
从每个文件夹下的每个文件中筛选出前两个数字都是4位的字符串,接着获取所有筛选出的字符串的第20位组成一个字符串,flag就是这个字符串的32位大写MD5的值
0X02 怎么解
1.先说 shell 版本吧
思考方式是这样的:
(1)按顺序获取文件,使用 shell 的循环实现,设置变量
(2)匹配两个四位数的行使用 shell 中筛选函数 grep
(3)找出每行中的第20位字符使用 sed/awk/cut ,最后我选了 cut
(4)将筛选出的字符 合成一个字符串使用替换\n 为空的方式,使用 sed 和 tr
给出脚本:
#!/bin/bash
i=1
for dir in ./BAT/*
do
#echo "----------------------------------file${i}-------------------------------------"
#cat ./BAT/${i}/${i}.txt | while read line
#do
#echo $line
#echo -e "\n"
#done
var=`grep -E '^[0-9]{4}----[0-9]{4}----.*$' ./BAT/${i}/${i}.txt`
echo -e ${var} >> tmpfile
i=`expr $i + 1`
done
cat tmpfile | sed 's/ /\n/g'| cut -b 20 | tr "\n" " "|sed 's/ //g' > newfile
rm tmpfile
注意:
这里有一个点,就是 sed 在用 s 进行替换的时候可以把空格替换成 \n 但是没法反过来,因为 sed 在进行替换的时候首先会去除所有的 \n ,操作完了再添加回去,因此我不得不用 tr ,但是 tr 似乎又不能直接替换成空,于是我只能先替换成空格。。。。无奈,当然,肯定有更简单的写法,我只是抛砖引玉。
小结:
亲自写过以后感觉 shell 脚本真的很强大,又让我回顾了一下 sed(行的增删改查)、 awk(划分列的好帮手)、 cut (截取利器)、grep(过滤神器) ,而且又用到了 tr 这个有趣的命令,还是很有收获
2.再说 bat 版本
bat 脚本我个人非常不推荐,感觉很不好写,一句话:“可费了我老劲了”
附上脚本:
@echo off
setlocal enabledelayedexpansion
for /L %%x in (1,1,50) Do (
cd %%x
for /F "tokens=* delims=----" %%i in (%%x.txt) Do (
echo %%i | findstr "^[0-9][0-9][0-9][0-9]----[0-9][0-9][0-9][0-9]----.*" >> ../test1.txt
)
cd ..
)
for /F "tokens=* delims=----" %%a in (test1.txt) Do (
set var=%%a
set var1=!var:~19,1!
echo !var1! >> test2.txt
)
for /F "tokens=*" %%b in (test2.txt) Do set /p "var2=%%b"<nul>>test3.txt
for /F "tokens=* delims= " %%c in (test3.txt) Do (
set var3=%%c
set solvtion=!var3: =!
echo !solvtion! >> solve1.txt
)
pause
感兴趣的童鞋可以看一下我之前的 bat 的语法总结,然后对照着看看,仅供参考
3.其他版本
想的真美,自己写去
0X03 题目生成脚本及 flag
1.生成脚本
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,50) DO (
md %%i
cd %%i
for /L %%a in (1,1,100) DO (
echo !random!----!random!----!random!!random!----!random!>>%%i.txt
)
cd ..
)
pause
2.flag
084B5737BFC8C3901C4E3A8BFF5AD6BC
3.注意点
我这个生成脚本是在 windows 下的,如果直接拿到 linux 下用 shell 处理会出现问题,因为回车换行的不同,这就需要各位自己替换解决啦!
0X03 总结
你亲自试一下就是知道 bat 脚本的效率非常的第,但是 shell 脚本就很高,可以说在代码简洁程度和运行效率上 shell 完胜,题目虽小,五脏俱全,有兴趣的同学可以自己尝试用各种能想到的方式实现,相信你会有新的收获。