一、前言
打开题目下载一个压缩包,一开始我以为是wireshark流量分析,发现格式不对,后来才知道其实就是在一堆文件夹中找到你需要的字段。
二、题目描述
现存在一份被黑客攻击修改了的工程文件,请应急工作人员找出黑客攻击的痕迹,flag格式为:flag{}。
三、解题思路
根据题目描述就是文件被修改,找到那个字段。
1.解压文件
2.在文件中使用如下命令找到flag字段:
strings $(find . | xargs) | grep flag
解释一下这个命令:
strings:就是打印文件中可打印的字符,这个文件可以是文本文件(test.c), 可执行文件(test), 动态链接库(test.o), 静态链接库(test.a),我们可以用strings命令查找编译的文件中的具体字符。
用法:
-a --all:扫描整个文件而不是只扫描目标文件初始化和装载段
-f –print-file-name:在显示字符串前先显示文件名
-n –bytes=[number]:找到并且输出所有NUL终止符序列
- :设置显示的最少的字符数,默认是4个字符
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-o :类似--radix=o
-T --target= :指定二进制文件格式
-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
@ :读取中选项
创建一个test.c的文件代码,内容如下
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 66;
int b = 55;
int c = add(a, b);
printf("hello fisher, c is %d\n", c);
return 0;
}
之后strings test.c 可见可以查出来可打印字符
接下来编译一下,产生a.out 文件
strings a.out
看不见输出?
这个问题先保留一下
strings -f * | grep “fisher”
可以查到fisher所在的可打印行
而strings $(find . | xargs) | grep flag
中的**$()**相当于括号作用,先执行括号里面的命令,这篇博客有详细说明。
博客链接:https://blog.csdn.net/weixin_37766087/article/details/99974385
find.
查找子目录和文件
“|”管道符,将标准输出流转换为标准输入流
“xargs” 将是将标准输入转为命令行参数,一般搭配管道符“|”使用
解释一下:
大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数,而xargs就可以解决这个问题。
这篇博客有详细说明:
https://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
> strings $(find . | xargs) | grep flag
整理一下逻辑:
首先先执行$()中内容:遍历查找文件或子目录 作为命令,接下来
strings | grep flag
将遍历中的目录或文件一个一个匹配查找带有flag字段的文件,然后打印出来
当然我也试着用
**
find -name "*" | xargs strings -f | grep flag
**
遍历出来了许多带有flag字段的文件,通过对比可知:
strings一般查找文件内容,而find一般查找文件和子子目录
四、收获:
1.熟悉strings命令使用
2.了解了管道符和xrags命令