为什么想介绍这几个命令?
- 原因是某次比赛中,当我还在写py脚本时,题目被一个师傅开局就秒了,比赛完才知道linux下还有各种专门用来文本处理的脚本,当时就被那长长的一条处理命令震惊到了。而ctf比赛中比较简单的杂项题有些是可以strings+正则匹配一把梭的。
- 国外一些比赛的wp中会有人写shell脚本处理题目,经常看到这几个命令,早想学习但一直鸽。
- 还有就是在读某些比赛的dockerfile时发现有出题人使用这些命令去完成docker容器的初始化,感觉还是很有用的。
(当然最大的原因是为了装B)
关于这几条命令的参数
比赛中的使用例子
xman 2019 选拔赛
题目给了一个流量包文件
可以看到像是wifi的流量包,这里只有ssid很可疑,像是有flag,但整个流量包一共有9233行ssid,直接看是找不到的,需要正则匹配。首先strings一把梭
strings ctf.pcap
发现有大量冗余信息neko,于是通过正则去除
strings ctf.pcap | grep -x '.\{32,33\}'
所有ssid都是32位的,这里只匹配一行的长度是32的字符串,得到ssid内容
下一步,我们通过观察,看到每行都有一个非字母数字的符号(^!&),于是很容易想到flag所在的行应该全是字母数字,没有特殊符号 (一点都不容易想到好吧,太脑洞了) 于是我们在之前的命令上加点细节,找到了flag
strings ctf.pcap | grep -x '.\{32,33\}'| awk '{print $1}'|grep -xno '[[:alnum:]]*'
这里grep加-n所以显示了行号7662,也就是ssid在7662行,这就是flag了
another
另一个是某次比赛中一个图像隐写的题目
zsteg可以看到输出有段base64,直接复制解密就得到flag了。为了练习这几个命令的使用,用sed命令+正则提取第二行的base64,然后解密
└─[$] <> zsteg flag.png | sed -n '2 p'
b1,bgr,lsb,xy .. text: "ZmxhZ3s1NDJmYjQzM2Y0YzhlYmYwMmY3OGUwZjA0MzZkMmU3Nn0="
加点细节
└─[$] <> zsteg flag.png | sed -n '2 p' | grep -o "\"[a-z,A-Z,0-9,=]*\"" | grep -o "[a-z,A-Z,0-9,=]" | base64 -d
flag{542fb433f4c8ebf02f78e0f0436d2e76}%
(当然对这个题来说这样做更麻烦了,但主要是为了演示下这几个命令)