misc 0x01-checkin
对图片进行分析,使用hex
可以看到图片的末尾有一段十六进制显示是有区别的,这里可以考虑一下是编码不同的原因
1 https:// lzltool.cn/Tools/ HexToUtf8
这里根据jpg的文件 FF D9 识别,在复制后面的数据进行16进制转UTF-8
1 自由法治自由和谐平等自由自由公正法治友善平等法治法治法治平等平等友善敬业法治法治公正平等公正敬业平等友善敬业法治民主公正敬业平等友善敬业法治敬业法治平等公正平等平等友善敬业公正爱国公正民主公正友善敬业法治法治公正民主公正诚信自由文明民主文明民主文明民主法治友善法治
1 核心价值观编码 https:// sym233.github.io/core-values-encoder/
1 GCTF{wu_wei_qi_yue_haowan!!!}
0x02-送分的Forensics 1
社工题,这类题目主要考察信息收集能力,对图片类型可以使用网上的一些识图工具
例如百度识图或者google
百度识图推测的地址为江心屿,但实际是个错误的地方,分析一下识别出来的内容
根据这篇文章的内容可以知道图片的地点为湘江,详细地点为纪念杜甫的遗迹,搜索一下
得到地点
0x03-送分的Forensics 2
同样类型的题目,照着同样的操作即可
可以看到和题目中的一模一样,
搜索一下得到地点
0x04-嘿嘿,真的是无畏契约呢 1 iVBORw0KGgoAAAANSUhEUgAAAXIAAAFyCAIAAABnRsZeAAAHiElEQVR4nO3cwYrcRhRAUSn4/z/ZymKcMGShReoWVdVzDhibgW5p1O1LLR7v/v38vp77vp/ruZ7rvq/ruZ/7uZ77up77/vrZc13Xdd3P15/rea77up/7uq/rua77er7++vP3fT3Xff15yXN9vfz5/vPn61/PdV3XfV9fb/Hf9//39f9cBTjC/TzP6nsAPspfq28A+DSyAsRkBYjJChCTFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgJitATFaAmKwAMVkBYrICxGQFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChCTFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgJitA7NeqC9/3verSkzzP879fO+9pvN/V+3Xn/Uar7uqd72TFaQWIyQoQkxUgJitATFaAmKwAMVkBYrICxGQFiC2bsn23ajrw3apZ2Hfvd7VqYvXdntO9737ad3KE0woQkxUgJitATFaAmKwAMVkBYrICxGQFiMkKENt0yvbdntOuI/b8jUbuatWkrE9wB04rQExWgJisADFZAWKyAsRkBYjJChCTFSAmK0DsyCnbE41Mjs6b4Nxzjnbea0+cWD2R0woQkxUgJitATFaAmKwAMVkBYrICxGQFiMkKEDNle7yRCd1V0718NqcVICYrQExWgJisADFZAWKyAsRkBYjJChCTFSB25JTtiRtJV82zjjyrVdtqV113xInfyXmcVoCYrAAxWQFisgLEZAWIyQoQkxUgJitATFaA2KZTtp+3RXXVTtl51503vzvvuiM+7zs5j9MKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChBbNmX703Z/njhXeqJVu3v5zmkFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYgtm7Id2Qw6bxpy3r7SkXueN4O7arr386aK9/w+r+K0AsRkBYjJChCTFSAmK0BMVoCYrAAxWQFisgLE7lUTfiNzlqteu8qe9zxvInnEqm/Ou1XvvIrTChCTFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQW7bLdtV04LzNr/PMm9Ecue68d141C/tu1dM4kdMKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChBbNmX7bt6s5IkbSVftOt1zW+0qP22D8ginFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgtumU7buRqcSRach5s5LmaL/bc4fuvOuO2HN+12kFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYgdOWU7Ys+Ns/N83u87ct1VT+PzJqHfOa0AMVkBYrICxGQFiMkKEJMVICYrQExWgJisALF71bbLVbOD8yZHT9xXuuenMOLztgKv+h86wmkFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYgt22W752bQEydlR647Yt688qqNsydO6K76Xr1zWgFisgLEZAWIyQoQkxUgJitATFaAmKwAMVkBYsumbOdZNd85Ys+dsiMzqfOmqE/cGnviPY9wWgFisgLEZAWIyQoQkxUgJitATFaAmKwAMVkBYveqKb1Vc6XvTnwaJ97zPKt2yr77vLnhd04rQExWgJisADFZAWKyAsRkBYjJChCTFSAmK0DsyF2282YW5027rtreuucs7LsTZ1Ln7f0due4qTitATFaAmKwAMVkBYrICxGQFiMkKEJMVICYrQGzTXbarJlbnPY1V05DzJjhPfM6f973ak9MKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChA7cpftuz33hp44v7tqw+6em33nPec9t/OOcFoBYrICxGQFiMkKEJMVICYrQExWgJisADFZAWLLdtn+NKsmdOddd9Wk7J47ZfecwF7FaQWIyQoQkxUgJitATFaAmKwAMVkBYrICxGQFiC3bZTtvf+cqI7OS8yZHR955zx2rq3bKrprQPXEG12kFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYgtm7J9t+dk4arJ4D132Y5cd96m2xHzvnUnfoIjnFaAmKwAMVkBYrICxGQFiMkKEJMVICYrQExWgNimU7bv9tyxOu+d99z7u+ddvVt1z6u2Ea/itALEZAWIyQoQkxUgJitATFaAmKwAMVkBYrICxI6csv08J+4rHbHnptt5T/L9nkeexp6cVoCYrAAxWQFisgLEZAWIyQoQkxUgJitATFaAmCnbLYzMlf60Cd159twLe+IMrtMKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChA7csp2z8nCd/NmYVdNYa66q1UbZ0eu+3mf/junFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgtumU7Z5bRVfZ82mMzHeueu2IPT+FPSfOnVaAmKwAMVkBYrICxGQFiMkKEJMVICYrQExWgNi955QecC6nFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgJitATFaAmKwAMVkBYrICxGQFiMkKEJMVICYrQExWgJisADFZAWKyAsRkBYjJChCTFSAmK0BMVoCYrAAxWQFisgLEZAWIyQoQkxUgJitATFaAmKwAMVkBYrICxGQFiP0NIdMzLuV40U8AAAAASUVORK5CYII=
CyberChef
解码得到图片数据,再转换得到一张二维码
扫描发现是wuweiqiyue的官网,那就导出这张二维码分析png图片里的数据
并没有发现内容,这时候思考一下png图片的一些像素隐写,使用zsteg 工具检测一下png图片中的lsb数据
得到flag
0x05-真的是basc64哦
看文件的内容,很明显的base64隐写
网上脚本也很多
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import base64 path = '4nums.txt' #将需要解密的内容填入文本文件 file = open(path,encoding='utf-8') a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" aaa = '' while True: text = file.readline() # 只读取一行内容 # 判断是否读取到内容 text = text.replace("\n", "") if not text: break if text.count('=') == 1: aaa = aaa + \ str('{:02b}'.format((a.find(text[len(text)-2])) % 4)) if text.count('=') == 2: aaa = aaa + \ str('{:04b}'.format((a.find(text[len(text)-3])) % 16)) file.close() t = "" ttt = len(aaa) ttt = ttt//8*8 for i in range(0,ttt,8): t = t + chr(int( aaa[i:i+8],2)) print(t)
1 GCTF{you_kn0w_base_sixsix_four}
0x06-ez_流量
观察流量包特征,发现又sql注入的痕迹
过滤http流量,只筛选GET包
导出分组解析结果为CSV
去掉其他数据,对注入数据进行分析得出结论,注入方式为布尔盲注,何为布尔盲注
substr函数原理
在构造SQL语句之时,and后面如果跟着一个大于0的数,那么SQL语句正确执行,所以利用此特性,使用substr截取字符,当截取的字符不存在,再通过asci函数处理之后将会变成false,页面将回显错误
1 2 3 4 5 6 SELECT*from users WHERE id = l and ascii(substr(database(),8,1)) substr 返回子字符串 8是当前数据库'security'的长度 ,从第8个开始,取1位,则是'r' 如果pos为9 那么开始位置大于字符串长度,ascii函数处理后将变成false and 后只要不为 0,页面都会返回正常
此处为求数据库的名,根据这个原理分析一下过滤出来的注入数据信息
1 2 3 4 5 6 7 8 9 10 GET /ctf/Less-5/?id=1%20and%20ascii(substr((select%20flag%20from%20t),1,1))=33--+ HTTP/1.1 #取出关键注入数据 ?id=1%20and%20ascii(substr((select%20flag%20from%20t),1,1))=33 判断注入 ascii()函数用于获取一个字符的 ASCII 码值。整个这部分的意思是,获取 flag 字符串的第一个字符的 ASCII 码值,并与 33 进行比较。攻击者通过不断修改这个比较的值(例如从 33 开始逐步尝试不同的 ASCII 码值),根据数据库返回的结果(如果条件满足返回相应数据行,不满足则可能返回空结果或错误提示等不同情况,取决于具体数据库和应用程序设置)来判断猜测的字符是否正确。如果数据库执行这个注入语句后返回了预期的结果(比如符合前面正常查询条件 id = 1 且这个字符比较条件也满足的数据行),那么就说明猜测的这个字符的 ASCII 码值是正确的,进而可以继续猜测下一个字符,通过不断重复这个过程,理论上就可以逐步还原出整个 flag 字符串。 使用substr返回在名为t表的flag值,这里的1,1则是查询得到的 flag 字符串结果中,截取从第 1 个字符开始,长度为 1 的子字符串,也就是只获取 flag 字符串的第一个字符。通过这种方式,攻击者可以逐个字符地去猜测 flag 的内容
了解了原理就可以很清楚的明白,每个切片返回的ascii值就是读取到的正确字符
这里的 1,1 变为 2,1 说明上一个ascii为正确的值,
以此类推得到全部的ascii值
1 102 108 97 103 123 119 49 114 101 115 104 65 82 75 95 101 122 95 49 115 110 116 105 116 125 126 126 126 126
转换一下数据
1 https:// www.lzltool.cn/Tools/ AsciiToText
得到flag
1 flag{w1reshARK_ez_1sntit}
0x07-ez_forensics
一张图片跟一个加密的文件
图片为纯白,分析数据并没有内容
再仔细观察图片可以发现在左上角有一点不同的像素,可以想到像素隐写,使用zsteg工具跑一下
可以发现无法检测到隐写内容,这时候可以使用 –all 参数对图片文件使用所有的方法进行检测
成功得到key信息
1 key: y0 u_c4 n_n3 v3 r_kn0 w_7 h3 _k3 y
得到key后,再看到另一个加密文件,结合题目名可以想到内存取证需要使用到key的软件
输入从图片中得到的key
加载完成后再资源管理器中找到我们挂载的盘符,得到flag
1 GCTF{f0r3n51c5_4nd_158_15_34zy}
0x09-ez_word
word文件,拿到文件的时候可以想想这种类型的文件有什么隐写方式,
一些看不见的字符我们可以直接全选文档然后将字体颜色设置为红色
复制不出来直接右键搜索即可
点开文件对隐藏图片显示进行设置,找到账户下的选项
打开显示隐藏文字,得到图片
接着去分析word文件的数据
word文件的底部发现有个压缩包,另存一下压缩包文件
base100加密
1 🐝🐚🐮🐯🐲🐝🐚🐨🐩🐩🐲🐝🐚🐨🐧🐫🐲🐝🐚🐨🐨🐰🐲🐝🐚🐮🐮🐲🐝🐚🐨🐨🐧🐲🐝🐚🐭🐭🐲🐝🐚🐰🐧🐲🐝🐚🐰🐮🐲🐝🐚🐭🐰🐲🐝🐚🐨🐩🐧🐲🐝🐚🐬🐩🐲🐝🐚🐯🐨🐲🐝🐚🐨🐩🐩🐲🐝🐚🐯🐩🐲🐝🐚🐮🐧🐲🐝🐚🐰🐯🐲🐝🐚🐨🐨🐧🐲🐝🐚🐭🐬🐲🐝🐚🐭🐨🐲
解码得到unicode
1 NzhwMnBZaEx4QzRFbnA=
这里推荐一个解码工具
1 2 ToolsFx [GitHub - Leon406/ToolsFx: 基于kotlin+tornadoFx的跨平台密码学工具箱.包含编解码,编码转换,加解密, 哈希,MAC,签名,大数运算,压缩,二维码功能,ctf等实用功能,支持插件] (https :
可以直接梭哈出结果,但是不得不提一嘴,工具是为了更便捷的做题目,新手ctfer还是要去了解一下各种编码的原理,只有懂了原理才能成为真正的ctfer糕手。
1 2 Flag3=m1ssccc$$} GCTF{welc33me_w0rd@_m1ssccc$$}
0x10-爱玩原神?
题目只有一张图片,这时候可以分析一下文件数据
可以看到jpg图片的尾部还有一个压缩包,搜索jpg的文件尾将PK(504B)开头的内容另存为一个新文件,
拿到隐藏的压缩包,压缩包中有个文本文件但是压缩包是加密的,这时候需要再jpg图片中继续寻找压缩包的密码
jpg的隐写,试过其他的之后,尝试到隐形水印的时候有了结果
得到密码
盲水印的原理
1 2 盲水印是一种肉眼不可见的水印方式,对图片资源使用图片盲水印或者文字水印,借此避免数字媒体未经授权的复制和拷贝,可通过对原图进行解码操作,得到水印图来证明版权归属。 这类盲水印是怎样实现的呢?原理并不复杂,通常是将图片进行离散余弦、小波或者傅里叶变换,得到图片的频谱信息,再将水印的编码信息叠加到图片的频谱上,然后再进行一次逆变换,生成的图片就带有几乎无法检测、但又可以确切还原出来的盲水印了。
题目的盲水印无需原图即可还原也可以称为单图盲水印
使用得到的密码解压压缩包得到文本文件的内容
很明显的逆序,这里的文本文件里的内容已经显示出来了将编码逆序即可
附上一个逆序的脚本,恢复压缩包还是无法解压的,因为数据内容只是像压缩包其实并不是压缩包
1 2 3 a = open('ys.zip','rb') b = open('ysqd.zip','wb') b = b.write(a.read()[::-1]) #把读取到的数据::-1即可
1 GCTF{yu@nsh3n_qid0ng_qidong!!!}
0x11-坚持不懈的压缩
解压压缩包得到password文本文件和一个加密的压缩包
先看到passwd文件里的内容
俩个等号,这时候就已经想到base64编码了,应该是换码表了,所以看起来和正常的base64有些不一样
使用CyberChef 进行解码的操作
得到密码,再用密码去解压加密的压缩包,发现可以成功解压
下一层同理,也能使用密码进行解压
典型的压缩包套娃,解压一千次就能得到flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import os import zipfile def recursive_unzip(zip_file_path, password): with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: try: zip_ref.extractall(pwd=password.encode('utf-8')) except RuntimeError as e: print(f"解压 {zip_file_path} 时出错: {e}") return base_folder = os.path.splitext(zip_file_path)[0] for root, dirs, files in os.walk(base_folder): for file in files: file_path = os.path.join(root, file) if file_path.endswith('.zip'): recursive_unzip(file_path, password) if __name__ == "__main__": password = "GCTF_yeyeyeye" zip_file_names = [] for i in range(998, 0, -1): #此处998需要修改为同目录下压缩包的名字,比如我是997就需要改为997 zip_file_names.append(f"temp_{i}.zip") for zip_file_name in zip_file_names: recursive_unzip(zip_file_name, password)
比较懒,就优化一下,能用就行,
找到temp_0
输入密码得到flag文件
1 GCTF{the_final_is_me_hahaha!!!}
0x12-可惜雪飘进了双眼
打开文本文件可以,发现里面有字符但是看不见,可以想到应该是whitespace
white_space是一种编程语言 由”空格”,”回车”,”tab”组成
1 [Whitelips the Esoteric Language IDE] (https :
没有内容输出,那就只能看到给的key文件了
看数据可以发现文件头是png的 89 50 4E 47
使用一字节的逆序脚本就行
1 2 3 4 5 6 7 8 9 10 11 hex_string = "" #此处填需要逆序的十六进制 hex_list = hex_string.split() # 将16进制字符串按空格分割成一个列表 result_list = [] # 存储转换后的结果 for num_hex in hex_list: num_int = int(num_hex, 16) # 将16进制字符串转成10进制整数 num_hex_reversed = hex(num_int)[2:].rjust(2, '0')[::-1] # 将10进制整数转换成16进制字符串,并反转字节 result_list.append(num_hex_reversed) # 将转换后的16进制字符串添加到结果列表中 result_str = ' '.join(result_list) # 将结果列表按空格连接成一个字符串 print(result_str) # 输出转换后的结果字符串
得到的十六进制另存为一个新文件,再使用文件逆序
1 2 3 a = open('mnimnimnim.png','rb') b = open('mnimnimnimnim.png','wb') b = b.write(a.read()[::-1])
最后得到图片内容,
得到的应该就是真的key ,除了white_space 隐写还有一种空白隐写,也就是SNOW隐写
SNOW 用于通过在行尾附加空格和制表符来隐藏 ASCII 文本中的消息,即文本隐写 。由于空格和制表符在文本查看器中通常不可见,因此消息实际上对不经意的观察者隐藏。并且如果使用内置加密,即使检测到消息也无法读取。
结合我们得到的key去尝试解密