签到题,下载附件得到一个.git
的文件夹,正常情况下文件夹被隐藏,显示隐藏后可以看到,百度可知这个.git
文件夹是创建git仓库时部署在本地的一个类似目录的东西
在git 克隆代码之后,还不能直接使用git,而需要初始化git,它会自动创建git仓库需要的目录。这些文件存在于项目下的.git文件夹下。
有两种做法,一种是可以直接在.git
文件夹所在目录进行git pull
操作,得到git仓库中的文件(但是我没pull下来,有其他师傅pull成功了),得到的文件直接就是flag.txt
另一种方法(也是我做的方法),打开文件夹查看里面的内容,可以在config中看到
[remote "origin"]
url = git@github.com:xinyongpeng/whuctfflag.git
fetch = +refs/heads/*:refs/remotes/origin/*
直接在GitHub中搜索xinyongpeng
这个id,就可以在他的主页找到flag
flag:whuctf{bc6cb6f4-1924-4683-a42c-cdc97653d2f6}
下载附件,只有一个yummy.jpg,尝试有关jpg的隐写,最终steghide可以解出隐藏的内容
steghide extract -sf yummy.jpg
隐写的内容
ABAAABAABBABAAABAABAABAAAABBAAABBBBABBBABAAABBAABBAAAAAABBABBAABBBAABBABBBAAABAAAAAAABAABBAAAABBAAABAABAAAAAAAABABAAABABAAAAABAABABAABB
只有A
和B
,很明显的培根密码,在线解密一下,再包上whuctf{}
即是flag
flag:whuctf{ITISIMPORTANTTOEATBREAKFAST}
下载附件得到一个zip包,里面一个有一个加密的zip和一个txt,txt中是一大串的颜文字,很明显的AAencode,在线网站解一下得到
我猜扫码得不到flag,但,也许呢?
再看加密的zip包,尝试解一下伪加密,得到里面的png,是一个反色而且缺了三个定位码的二维码,反色后补全
扫码得到一个b站的个人空间链接:https://space.bilibili.com/309312103
访问这个链接可以发现是出题人小姐姐,而且唱歌还很好听,在公告下方的个人信息处有个标签:1234
再结合公告里来找key的提示,推测这个1234
就是某种加密的密钥
其实这道题刚放出来的时候空间主页里并没有这个信息(应该是小姐姐忘了弄了),后来小姐姐更新了一下,所以一眼就被我发现了2333
由于附件中只给了一个png可以用来加密,再结合密钥,推测是那种需要密钥的LSB隐写,用脚本解一下可以得到一大长串的十六进制字符串,看开头没有什么想法,翻到结尾发现是倒过来的89 50 4E 47
,所以写脚本翻转一下,写到png文件中
f = open('out.txt','r').read()[::-1]
fi = open('flag.png','w')
fi.write(f.decode('hex'))
fi.close()
得到图片,打开就是flag
下载附件得到两个txt文件,查看说明
小p发现自己的文章被别人复制粘贴了,感到很气愤,于是他偷偷地将flag藏到了文章中,你能找到flag吗? 格式 whuctf{}
再查看题目.txt
,能看到的里面都是重复的我很帅
三个字,结合题名版权保护和题目描述,很容易想到出题人利用零宽度字符进行隐写(因为零宽度字符可以用来作为一种水印,可参考这篇文章,用vim查看
可以看到里面只有<200d>
和<200c>
这两种零宽度字符,稍微调整一下界面
可以很清楚的看到每两个字中间的零宽度字符数量相等,且数量都为8,再结合只有两种字符,想到将其转换为01序列,再每八个一组转换成对应字符
先将txt中的汉字都替换掉,再直接winhex观察文件,可以发现每个零宽度字符占三字节的长度,而且这两种字符只有第三字节不相同,一种是E2 80 8D
,另一种是E2 80 8C
,先把十六进制复制出来存为txt,再写脚本提取一下,转换成flag
import libnum
f = open('1.txt','r').read().strip().replace('E2808','')
out = ''
for i in f:
if i == 'D':
out += '0'
else:
out += '1'
flag = ''
for i in range(0,len(out),8):
flag += libnum.b2s(out[i:i+8])
print flag
得到flag:whuctf{Y0u_kn0w_h0w_t0_pr0tect111}
下载附件,可以看出来是一个游戏,如果是明文flag的话,那一定是可以直接搜出来的(游戏题怎么可能玩游戏),那么我们直接看txt这个文件夹,打开观察里面的内容,发现都是倒序的,比如
["thgieHrenni",")53.0 ,0 ,0 ,0(abgr",")53.0 ,812 ,822 ,832(abgr","redner","etadpu","evas","egamIward","egamI$gb","tceRdnuoRllif","dirGward"]
于是就推测flag的格式也是倒序的,所以直接在txt这个文件夹中strings命令搜索
strings * | grep -i ftcuhw
发现有搜到的内容,直接把输出的内容全部复制出来,再搜索即可得到flag的逆序
}1m4g_tahcew{ftcuhw
再逆序过来就是flag:whuctf{wechat_g4m1}
这道题的第一步考点个人觉得很好,第二步有点小问题,不过无伤大雅
拿到图片和一个加密的压缩包,先看图片,在详细信息中可以看到这样一句话
我猜你是来找线索的,别爆破了,爆不出来的,因为密码有13位
一开始找了半天只有这个,就卡住了,直到小姐姐放了这个hint
jpg文件末尾有几位关键信息
在图片末尾FF D9
前可以看到ISBN
这样的字样,一开始没当回事,后来百度了一下才知道这个字符串竟然有含义
再结合图片内容这本书,最终查到了对应的ISBN号
去掉其中的-
,剩下的数字刚好是13位,也符合密码的位数,所以得到压缩包密码
打开压缩包,其中有100张图片,刚好是10x10
的规格,而且看缩略图也能发现当排列为10*10的时候恰好图案可以对上,所以拼图,将其拼起来,在这里我用了convert
命令,稍微麻烦了点,可以参考这里
关于最后一步小姐姐给了hint
最后一步:光栅等距填充
完全没有接触过的考点,不过有可以参考的原题:D^3CTF2019 vera
我自己写了个脚本填充了一下,不过效果不咋地
from PIL import Image
im = Image.open('10.jpg')
img = im.copy()
pix = img.load()
wid = img.size[0]
hei = img.size[1]
for w in range(wid):
for h in range(hei):
if w % 2 == 0:
pix[w,h] = 0
img.save('flag.png')
勉勉强强只能看出来几个字母,下面附上原图
可以看出flag:WHUCTF{GUANG_SH@N}
ps:如果有师傅能写脚本完整恢复出来,请务必教教我!
题目描述中一段佛曰加密
佛曰:般羅穆僧冥神大侄所隸奢尼哆恐侄大藐若故曳咒室呐阿竟諳他缽悉爍諦哆咒豆苦缽尼帝所冥等上哆瑟俱薩諸諳伊冥特諳實怯他罰不參亦皤有婆僧藝俱羯怯至皤滅知真哆訶亦能怯瑟梵陀奢知呼故梵夢死有皤能薩曰俱穆勝竟怯明奢參世缽佛皤羯瑟奢孕梵逝楞呐醯故奢想謹提諦盡侄阿哆利俱吉罰老謹涅神能皤集實輸奢薩奢數哆波者俱勝俱所遠盡呐倒利闍盧諦罰薩梵曰度提大諦哆穆輸醯怯參侄諸娑梵伽知勝穆伊顛冥參道冥有
在线网站解密得到
767566536773bf1ef643676363676784e1d015847635575637560ff4f41d
看到题目描述中写到栅栏边上,于是联想栅栏密码,多次尝试后当栅栏数为6时得到
7768756374667b6e305f315f616d5f6e30745f615f36756464683173747d
再十六进制解码即可得到flag:whuctf{n0_1_am_n0t_a_6uddh1st}
感谢false师傅的wp!!
题目考点为冰蝎的加密流量分析
打开流量包,过滤http
可以发现两条pass=xxx
的流量,是冰蝎流量的特征
任选其中一条,追踪TCP流,在流中可以看到有两个返回的长度为16的字符串,这是冰蝎流量的解密密钥
我们在翻看TCP流的时候可以看到在第五流之前都是蚁剑的base64加密流量,从5开始为冰蝎的加密流量,且密钥为91ee1bfc4fd27c90
我们需要知道的是冰蝎通常采用AES加密,可以参考
将下面的流量解密,在线网站即可
得到base64加密的字符串,再次解密,得到一段php代码
@error_reporting(0);
function main($content)
{
$result = array();
$result["status"] = base64_encode("success");
$result["msg"] = base64_encode($content);
$key = $_SESSION['k'];
echo encrypt(json_encode($result),$key);
}
function encrypt($data,$key)
{
if(!extension_loaded('openssl'))
{
for($i=0;$i<strlen($data);$i++) {
$data[$i] = $data[$i]^$key[$i+1&15];
}
return $data;
}
else
{
return openssl_encrypt($data, "AES128", $key);
}
}$content="6ac0a2b1-e69e-463e-8f1d-f19474de887f";
main($content);
其中$key
还是之前加密流量用到的91ee1bfc4fd27c90
,可以看到代码中再次进行了AES128
加密,所以如果想要知道服务器返回了什么数据,就需要对返回流量进行解密
同样用刚刚的网站即可解密,得到
{"status":"c3VjY2Vzcw==","msg":"NmFjMGEyYjEtZTY5ZS00NjNlLThmMWQtZjE5NDc0ZGU4ODdm"}
将其中的值解base64,得到status的值为success,但msg的值并不是flag,用同样的方法依次解密下面的流量,我们只需要挑这种比较短的流量尝试即可,而且密钥也和上述相同,最终在TCP 流7的最下面找到flag
<?php
//$flag = "whuctf{cd768eac-0746-4979-a40d-5b6a269c4dde}"
?>
首次接触区块链的题,这也是一道送分题,连接上之后操作一下即可得到flag
参考教程:https://blog.csdn.net/a3320315/article/details/105233035/