一道很锻炼脚本能力的小题(包括正则,文件处理,字符串处理等)

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

文章目录
  1. 1. 0X00 前言
  2. 2. 0X01 题目介绍
    1. 2.1. 题目名称:想去BAT?先过我这关!
    2. 2.2. flag如何获取?
  3. 3. 0X02 怎么解
    1. 3.1. 1.先说 shell 版本吧
      1. 3.1.1. 思考方式是这样的:
      2. 3.1.2. 给出脚本:
      3. 3.1.3. 注意:
      4. 3.1.4. 小结:
    2. 3.2. 2.再说 bat 版本
      1. 3.2.1. 附上脚本:
    3. 3.3. 3.其他版本
  4. 4. 0X03 题目生成脚本及 flag
    1. 4.1. 1.生成脚本
    2. 4.2. 2.flag
    3. 4.3. 3.注意点
  5. 5. 0X03 总结
|