【MISC】CTF练习作业
1.gif
因为是一张图片,所以猜想是信息附加
所以用010editor打开得到flag{123456}
2.png
小鳄鱼图片,在得到提示后,得知是要增加图片的高度。
一开始一直用010editor编辑,发现无论改成什么图片都无法显示。(再也不相信010editor了)
于是用winhex将图片高度提高,保存后得到flag
3.png
将图片先用binwalk扫描一下看是否能分离
于是桌面出现分离后的文件夹点进去得到flag
es.zip
一开始以为这个zip文件是伪加密,用010editor编辑器修改文件也无法解决。
- 最后得知与右边的提示有关。PINyin:哇库哇库,猜想密码为WAKUwaku。
- 解压后有三个文件,其中前两个txt文件为提示
- 第一个提示为
猜想为逆序的考点
于是用winhex打开第三个文件乖女儿,发现文件头为png文件尾的逆序
-
查阅资料,运用python脚本文件进行反转逆序
with open('乖女儿', 'rb') as f: s = f.read() t = [x // 16 + 16 * (x % 16) for x in s] with open('乖女儿.png', 'wb') as f: f.write(bytes(t)) f = open('乖女儿.png', 'rb').read() res = open('乖女儿.png', 'wb') res.write(f[::-1])
反转后,生成乖女儿.png文件
-
补充文件头89504E47后
得到一张图片
-
查看hint_2.txt中的给她在祖安用 海克斯 科技瘦脸瘦了200,猜想得知图片的宽度缩小了200,于是将 00 00 00 E5 改为 00 00 02 E5后得到如下图
上周作业汇总:
4.png做题过程:
1.如图所示,4.png初始时是一张完全黑的图片,一开始想着尝试用stegsolve工具看能分解出什么,发现也是徒劳。
2.在负责人同学的帮助下,运用tweakpng工具打开图片。发现有多个idat块,于是我删除了两个idat块后,将图片保存后,图片就展现出flag。(tweakpng工具的相关解释在笔记中体现)
4.png题后总结:
做完这道题,发现我对idat块的理解还不到位:
IDAT
图像数据块IDAT(image data chunk):它存储实际的数据, 在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
总之之后可以先用010或teakpng工具打开,查看图片是否有多个idat块,尝试删除第一个IDAT块,另存为后打开新图片。如果还不行,就多删几个IDAT块。
stego.png做题过程
这道题一开始也是没啥头绪的,于是先在kali上用binwalk分离一下此图片,得到如下文件夹
得到2.jpg文件
用exif查看文件信息
找到了flag的一部分Part1: n1book{414e529ece64a77d
猜想还有一部分flag,在使用stegsolve后也未找到
寻求帮助后,了解到工具zsteg
zsteg是用来检验lsb隐写的工具
- Linux下的工具:zteg工具
- 下载:
gem install zsteg
- 下载时一定要在最后加/root/Desktop
- 检测LSB隐写:
zsteg xxx.png
- 下载:
一开始我直接zsteg 2.jpg 发现什么都没有 还会报错
学习后发现zsteg只能用来检测bmp或png的图片类型
所以我检测stego.png 但一开始是什么也得不到的
于是我输入zsteg <文件名> --all
得到flag的第二部分
Part2: 25cc9ee5108a49c6}
所以,flag全部为n1book{414e529ece64a77d25cc9ee5108a49c6}
本周流量分析作业
攻防世界1
题目分析:你知道完整内容是什么吗(请关注流量包本身,和对应网址的内容无关)
附件一个压缩包,解压得到一个抓包文件,wireshark进行分析,同样是关注流量内容,HTTP流量引起关注,查看包内容和Request URI,发现是传输的文件。
题目已经提示我们不用去看网址了,那么直接看流量包内容。
解题过程
- 先导出为http对象
-
导出后发现各个数据包拼接起来就是flag(点击preview)
-
所以,flag
攻防世界2
解题过程:
这道题是很简单的流量分析题,用wireshark打开后,发现全是tcp流
- 右键追踪tcp流 得到flag
buuctf1
题目分析:题目已经提到flag在密码里,猜想在数据包中搜索password
解题过程:
-
搜索password
-
但这里一开始我出现了问题,一开始是在分组列表中搜索的,所以找不到结果
-
切记选中分组字节流,字符串 再进行搜索
-
-
搜索得到flag
buuctf2
题目分析:分析数据包即可
解题过程:
-
打开后,发现大部分是tcp,http很少
-
经过筛选后,有四个http
-
-
对前两个追踪流,都很正常
-
对后两个追踪http流得到
-
-
在查阅资料后,怀疑传输内容可能是base64密文
-
解码得到jpg图片
-
-
另存为图片后,打开图片,得到flag
-
攻防世界3
题目分析:
这道题也叫图片提取。题目提到flag,所以就现在数据包中寻找flag
解题过程:
-
搜索flag
-
-
发现里面有一个flag.png的文件,想着用wnhex打开图片,但查看头文件无法打开。
-
查看别人的writeup得到启示
-
于是用kali打开,这里需要安装一个工具tcpxtract
-
这里我发现对tcpxtract工具的描述很少,但其实它就是一个分离工具
-
安装tcpxtract
sudo apt-get install tcpxtract
-
然后提取文件数据:
tcpxtract -f 434c8c0ba659476caa9635b97f95600c.pcap
-
得到图片
-
-
从而得到flag
总结:这些题都相对简单,在做题过程中发现很多题都需要写脚本文件处理。
BUUCTF-EasySQL 1
解题思路:
本题考查的是 sql_mode
sql_mode:是一组mysql支持的基本语法及校验规则
PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
当 sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
并且大佬猜测后端的执行语句为:
select $_GET['query'] || flag from flag
解题步骤
-
判断注入类型
-
输入1 有回显,说明是数字型注入
-
爆库
-
爆表
-
爆字段
但在此爆字段时一直回显nonono
-
后端的查询语句为:
1;set sql_mode=PIPES_AS_CONCAT;select 1 from flag select flag from flag,所以:
我们可以用1;set sql_mode=PIPES_AS_CONCAT;select 1 获得 flag :
攻防世界-give_you_flag
题目描述:
菜狗找到了文件中的彩蛋很开心,给菜猫发了个表情包
解题步骤:
-
因为题目是一张gif图片,所以先考虑用stegsolve打开
-
打开frame browser
拓展:
stegsolve用法
在分析里面从上到下的依次意思是
File Format:文件格式
Data Extract:数据提取
Steregram Solve:立体试图 可以左右控制偏移
Frame Browser:帧浏览器
Image Combiner:拼图,图片拼接
Frame Browser:帧浏览器 主要是对GIF之类的动图进行分解,把动图一帧帧的放,有时候会是二维码**
在第50帧得到一个二维码
-
看到是一个缺少定位符的二维码,在网上找一个定位点图,用3d画图修改图片即可。得到以下图片
-
画图填充得到
-
用qr research打开照片扫描得到flag
flag{AppLeU0}
-
但这个不是正确答案
-
重新解码二维码
flag{e7d478cf6b915f50ab1277f78502a2c5}
攻防世界-stegano
题目描述:
菜狗收到了图后很开心,玩起了pdf 提交格式为flag{xxx},解密字符需小写
题目分析:
题目已经提到pfd隐写
解题过程:
先打开后是一个pdf文件,但显示flag不在这里,所以将所有所有文字全选粘贴到文本文档里
- 得到 BABA BBB BA BBA ABA AB B AAB ABAA AB B AA BBB BA AAA BBAABB AABA ABAA AB BBA BBBAAA ABBBB BA AAAB ABBBB AAAAA ABBBB BAAA ABAA AAABB BB AAABB AAAAA AAAAA AAAAB BBA AAABB
根据密文猜测是摩斯密码
拓展:摩斯密码
摩斯密码是一种将文本信息作为一系列通断的音调、灯光或咔嗒声传输的方法,无需特殊设备,熟记的小伙伴即可直接翻译。它以电报发明者Samuel F. B. Morse的名字命名。
算法
算法非常简单。英语中的每个字符都被一系列“点”和“破折号”代替,或者有时只是单数的“点”或“破折号”,反之亦然。
加密
在加密的情况下,我们一次一个地从单词中提取每个字符(如果不是空格),并将其与存储在我们选择的任何数据结构中的相应摩斯密码匹配(如果您使用 python 编码,字典可以变成在这种情况下非常有用)
将摩斯密码存储在一个变量中,该变量将包含我们编码的字符串,然后我们在包含结果的字符串中添加一个空格。
在用摩斯密码编码时,我们需要在每个字符之间添加 1 个空格,在每个单词之间添加 2 个连续空格。
如果字符是空格,则向包含结果的变量添加另一个空格。我们重复这个过程,直到我们遍历整个字符串
解密
在解密的情况下,我们首先在要解码的字符串末尾添加一个空格(这将在后面解释)。
现在我们继续从字符串中提取字符,直到我们没有任何空间。
一旦我们得到一个空格,我们就会在提取的字符序列(或我们的莫尔斯电码)中查找相应的英语字符,并将其添加到将存储结果的变量中。
请记住,跟踪空间是此解密过程中最重要的部分。一旦我们得到 2 个连续的空格,我们就会向包含解码字符串的变量添加另一个空格。
字符串末尾的最后一个空格将帮助我们识别莫尔斯电码字符的最后一个序列(因为空格充当提取字符并开始解码它们的检查)。
执行
Python 提供了一种称为字典的数据结构,它以键值对的形式存储信息,这对于实现诸如摩尔斯电码之类的密码非常方便。我们可以将摩斯密码表保存在字典中,其中 (键值对)=>(英文字符-莫尔斯电码) 。明文(英文字符)代替密钥,密文(摩斯密码)形成相应密钥的值。键的值可以从字典中访问,就像我们通过索引访问数组的值一样,反之亦然。
摩斯密码对照表
# 实现摩斯密码翻译器的 Python 程序
'''
VARIABLE KEY
'cipher' -> '存储英文字符串的摩斯翻译形式'
'decipher' -> '存储摩斯字符串的英文翻译形式'
'citext' -> '存储单个字符的摩斯密码'
'i' -> '计算摩斯字符之间的空格'
'message' -> '存储要编码或解码的字符串
'''
# 表示摩斯密码图的字典
MORSE_CODE_DICT = { 'A':'.-', 'B':'-...',
'C':'-.-.', 'D':'-..', 'E':'.',
'F':'..-.', 'G':'--.', 'H':'....',
'I':'..', 'J':'.---', 'K':'-.-',
'L':'.-..', 'M':'--', 'N':'-.',
'O':'---', 'P':'.--.', 'Q':'--.-',
'R':'.-.', 'S':'...', 'T':'-',
'U':'..-', 'V':'...-', 'W':'.--',
'X':'-..-', 'Y':'-.--', 'Z':'--..',
'1':'.----', '2':'..---', '3':'...--',
'4':'....-', '5':'.....', '6':'-....',
'7':'--...', '8':'---..', '9':'----.',
'0':'-----', ', ':'--..--', '.':'.-.-.-',
'?':'..--..', '/':'-..-.', '-':'-....-',
'(':'-.--.', ')':'-.--.-'}
# 根据摩斯密码图对字符串进行加密的函数
def encrypt(message):
cipher = ''
for letter in message:
if letter != ' ':
# 查字典并添加对应的摩斯密码
# 用空格分隔不同字符的摩斯密码
cipher += MORSE_CODE_DICT[letter] + ' '
else:
# 1个空格表示不同的字符
# 2表示不同的词
cipher += ' '
return cipher
# 将字符串从摩斯解密为英文的函数
def decrypt(message):
# 在末尾添加额外空间以访问最后一个摩斯密码
message += ' '
decipher = ''
citext = ''
for letter in message:
# 检查空间
if (letter != ' '):
# 计数器来跟踪空间
i = 0
# 在空格的情况下
citext += letter
# 在空间的情况下
else:
# 如果 i = 1 表示一个新字符
i += 1
# 如果 i = 2 表示一个新词
if i == 2 :
# 添加空格来分隔单词
decipher += ' '
else:
# 使用它们的值访问密钥(加密的反向)
decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT
.values()).index(citext)]
citext = ''
return decipher
# 硬编码驱动函数来运行程序
def main():
message = "JUEJIN-HAIYONG"
result = encrypt(message.upper())
print (result)
message = ".--- ..- . .--- .. -. -....- .... .- .. -.-- --- -. --."
result = decrypt(message)
print (result)
message = "I LOVE YOU"
result = encrypt(message.upper())
print (result)
message = ".. .-.. --- ...- . -.-- --- ..-"
result = decrypt(message)
print (result)
# 执行主函数
if __name__ == '__main__':
main()
复制代码
输出:
.--- ..- . .--- .. -. -....- .... .- .. -.-- --- -. --.
JUEJIN-HAIYONG
.. .-.. --- ...- . -.-- --- ..-
I LOVE YOU
复制代码
-
知道这串是摩斯密码后,用python脚本解码
得到-.-. --- -. --. .-. .- - ..- .-.. .- - .. --- -. ... --..-- ..-. .-.. .- --. ---... .---- -. ...- .---- ..... .---- -... .-.. ...-- -- ...-- ..... ..... ....- --. ...--
- 解码得到:congratulations,flag:1nv151bl3m3554g3
攻防世界-坚持60s
题目描述:
菜狗发现最近菜猫不爱理他,反而迷上了菜鸡
解题过程:
-
下载所给附件,发现是一个jar包,打开之后发现是一个游戏,根据题目提示可能是让我们挺过60s之后就可以得到flag
-
但是难以达到
-
根据别人的writeup可以得知
-
使用jd-gui反编译工具得到源码,果然在源码之中发现了flag
拓展:jd-gui
JD-GUI是一款反编译工具。
“编译”:将源代码转换成二进制执行代码的过程(.java--->.class);
“反编译”:将二进制转换为源代码的过程(.class--->.java)。
总结:
1、它可以把已经生成的Jar包反编译回代码的形式,没有经过代码混淆的Jar包反编译后和实际的源码会有一定的差别,但不影响阅读。
2、JD-GUI是可视化的,所以使用起来非常简单,只要引入Jar包就可以执行反编译。
-
用jd-gui打开得到
-
得到flag
-
但是不正确
-
仔细看好像是采用了base64编码,解码之后得到flag
DajiDali_JinwanChiji
小明的保险箱
解题思路:
- 下载好附件之后是一个.jpg文件,但是题目说保险箱有一个四位数的密码,因此我们猜测在这个.jpg文件中肯定还隐藏了其他文件,我们用二进制编辑器打开这个文件。
-
我们发现FF D9就是.jpg的文件尾就应该结束了,可后面还加了52 61 72 21这正是.rar的文件头吗
说明这里还藏着一个.rar文件
-
用kali打开 用binwalk分离得到
-
也可以用dd命令分离:
dd if=图片 of=RAR文件名 skip=79903 bs=1
-
打开发现有密码
-
因为密码是四位纯数字,用archpr暴力破解
-
得到密码为7869
-
得到flag
九连环
(65条消息) MISC-九连环_D1oMg的博客-CSDN博客_misc 九连环
- 下载好附件后发现是一个.jpg文件,按照之前的旧思路用二进制编辑器打开,我们去搜索.zip的文件头(50 4B 03 04)发现有很多,而且根据题目“九连环”也感觉这个文件不是那么简单
- binwalk,发现果然有东西
-
foremost后发现里面有一个加密zip文件
-
打开qwe.zip文件,并用010editor打开查看,得知是伪加密
- 改成00 08
-
-
bV1g6t5wZDJif^J7
攻防世界-gif
题目描述:
菜狗截获了一张菜鸡发给菜猫的动态图,却发现另有玄机
解题过程:
-
解压文件后得到一组黑白图片
-
打开文件出现多个黑白,让人联想到二进制,白色图片代表0,黑色图片代表1。01100110前八位二进制换算后为 f 证明思路正确。
-
编写python脚本:
这个代码参考了网络
from PIL import Image
result=""
for num,i in enumerate(range(104)):
img=Image.open(f"F:/image/dbbc971bf4da461fb8939ed8fc9c4c9d/gif/{i}.jpg")
im=img.convert("RGB")
r,g,b=im.getpixel((1,1))
if r!=255:
result+="1"
else:
result+="0"
for i in range(0,len(result),8):
byte=result[i:i+8]
print(chr(int(byte,2)),end="")
最后flag是:flag{FuN_giF}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix