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 完胜,题目虽小,五脏俱全,有兴趣的同学可以自己尝试用各种能想到的方式实现,相信你会有新的收获。