ACECTF 1.0 2025 writeup【部分】
赛事信息
- 赛事描述:https://ctftime.org/event/2619
- 赛事网址:https://acectf.tech/
- 排名:17
web
Buried Deep
打开网站后,习惯性的看一些robots.txt 发现如下内容
当依次看他们的时候,发现一些可疑信息,并尝试解密得到不同part的flag
49 115 116 32 80 97 114 116 32 111 102 32 116 104 101 32 70 108 97 103 32 105 115 32 58 32 65 67 69 67 84 70 123 49 110 102 49 108 55 114 52 55 49 110 103 95 55 104 51 95 53 121 53 55 51 109 95 32
first part: ACECTF{1nf1l7r471ng_7h3_5y573m_
当访问到secret_path的时候,拿到一些点和横线
..--- -. -..
.--. .- .-. -
--- ..-.
- .... .
..-. .-.. .- --.
.. ...
---...
.---- ..... ..--.- ...-- ....- ..... -.-- ..--.- .-- .... ...-- -. ..--.- -.-- ----- ..- ..--.- -.- -. ----- .-- ..--.- .-- .... ...-- .-. ...-- ..--.-
second part: 15_345Y_WH3N_Y0U_KN0W_WH3R3_
最后一段的提示在style中,将这content中的内容进行rot47解码,拿到part flag
third part flag:7h3_53cr3t5_4r3_bur13d}
flag: ACECTF{1nf1l7r471ng_7h3_5y573m_15_345y_wh3n_y0u_kn0w_wh3r3_7h3_53cr3t5_4r3_bur13d}
Flag-Fetcher
很简单的题,访问网站后,会自动发一些包,将这些依次排序得到flag
flag: ACECTF{r3d1r3ct10n}
Webrypto-18
考点:
- 代码审计
- MD5哈希碰撞
根据代码逻辑,必须满足两个条件:
- tom和jerry参数的值不同;
- 当这两个参数分别与’ACECTF’拼接后进行MD5哈希,结果必须相等。但这里使用的是弱类型比较
==
,而非严格比较===
可能的解决方案:
- 数组绕过:因为如果传递的参数是数组,例如tom[]=a&jerry[]=b,这时md5函数处理数组会返回NULL,导致两个NULL在弱比较下相等
- 找到两个开头为0e的md5值,在 php 弱类型比较中判断为相等
例如:- QNKCDZO
- 240610708
- s878926199a
- s214587387a
- s155964671a
最终payload:
?tom[]=s878926199a&jerry[]=240610708
flag: ACECTF{70m_4nd_j3rry_4r3_4ll135}
Token of Trust
打开网页,提示要post到login接口,模糊测试下来,构造请求体
得到json字段为user和pass
去jwt.io/将payload中的guest改为admin
然后携带token,post到flag接口,这里传输token的时候费了很大劲,以为要爆破请求头,结果最后居然还是用json来传递token
flag: ACECTF{jwt_cr4ck3d_4dm1n_4cce55_0bt41n3d!}
Bucket List
考察存储桶泄露,访问目标网站根目录,然后有一个secret.txt文件需要我们关注。
打开后是一串base64编码的flag,解码拿到flag
flag: ACECTF{7h3_4w5_15_m15c0nf16ur3d}
reverse
Trust Issues
下载附件,逆向后,程序逻辑会对比GRX14YcKLzXOlW5iaSlBIrN7
和你输入的字符串,然后经过一个_strcmp函数。
这个函数的逻辑
这里 v0 是一个固定数组,a0 是输入字符串,a1 是目标字符串 “GRX14YcKLzXOlW5iaSlBIrN7”。通过异或操作,可以推导出 v0 的值。
解题脚本如下,让chatgpt写就行
target = "GRX14YcKLzXOlW5iaSlBIrN7"
v0 = [6, 17, 29, 114, 96, 31, 24, 124, 62, 15, 109, 120, 51, 53, 64, 94, 62, 37, 95, 48, 120, 20, 55, 74]
flag = ''.join(chr(ord(c) ^ v0[i]) for i, c in enumerate(target))
print(flag) # ACECTF{7ru57_bu7_v3r1fy}
flag:ACECTF{7ru57_bu7_v3r1fy}
crypto
A Little Extra Knowledge Is Too Dangerous
打开附件是一个base64,如下所示
QUNFQ1RGe/MV82dTM1NV95MHVfN3J1bmM0N/zNkXzdoM18zeDdyNF9rbjB3bDN/kNjNfcjRkMG1fNTdyMW42NjY2NjY2NjY2NjU1NTU1NTU1NV/94eHh4eHh4YmJieHh4eHh4Y2N/jY3h9
直接开始解密,发现前边有ACECTF字符串,但后边很乱
开始尝试把反斜线分段,其中第一段舍弃,最后四段,去除反斜线,尝试解密,就拿到flag了,最后拼接到一块
将后四段放到一起解密
MV82dTM1NV95MHVfN3J1bmM0NzNkXzdoM18zeDdyNF9rbjB3bDNkNjNfcjRkMG1fNTdyMW42NjY2NjY2NjY2NjU1NTU1NTU1NV94eHh4eHh4YmJieHh4eHh4Y2NjY3h9
flag: ACECTF{1_6u355_y0u_7runc473d_7h3_3x7r4_kn0wl3d63_r4d0m_57r1n66666666666555555555_xxxxxxxbbbxxxxxxccccx}}
forensics
Broken Secrets
附件下载下来是7z文件,后缀改为7z 解压,打开是word文件(解压后的),找到media里有一个可疑文件,可惜是损坏的
用16进制打开发现存在 IHDR 字符串,这种png文件的特征,所以把前四个16进制位改为png的文件头89 50 4e 47
,再重新发开即可得flag
flag:ACECTF{h34d3r_15_k3y}
Hidden in the traffic
打开流量包,协议很杂,先丢给CTFNETA工具提取一下流量,把可以数据丢给一把梭
flag: ACECTF{p1n6_0f_D347h}
Another Reading between the Lines?
打开hidden文件,发现什么都没有,用xxd hidden
,看一下16进制,发现其中只有0d 和 0a 两种字符。
经过搜索发现,这可能是换行符,在windows中换行符是0d0a,而unix中换行符是0a
猜测可能要经过转换,把所有的0d0a换成1,所有的0a换成0,得到如下序列,再利用二进制转字符,得到flag
010000010100001101000101010000110101010001000110011110110110111000110000010111110111001000110011001101000110010000110001011011100011011001011111011000100110010100110111011101110011001100110011011011100101111100110111011010000011001101011111011011000011000101101110001100110011010101111101
flag: ACECTF{n0_r34d1n6_be7w33n_7h3_l1n35}
Deep Memory Dive
先用vscode打开memory_dump.raw,直接搜索ACECTF{,可以发现一些flag片段,但是再找其他的就找不到了,上工具吧先检查一下镜像信息,命令
volatility.exe -f D:\下载\memory_dump.raw imageinfo
然后用axiom打开,选择windows->内存->手动选择类型,加载即可,打开后发现隐藏的进程有个可疑的名字
再到vscode结合着搜索即可拿到最后一段flag
flag:ACECTF{3xplor1n6_th3_c0nc3al3d_r1ddl3s}
Keyboard Echo
参考:https://blog.csdn.net/ON_Zero/article/details/130528679
安装:sudo apt-get install tshark
tshark -r usb.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
-r:设置tshark 分析的输入文件
-T:设置解码结果输出的格式。包括fields,text,ps,psml和pdml,默认为text
再跑一下脚本就出了
#将上面的文件用脚本分隔,加上冒号;
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16:#键盘流量的话len为16鼠标为8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()
#最后用脚本提取
# print((line[6:8])) #输出6到8之间的值
#取出6到8之间的值
mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"\n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." }
nums = []
keys = open('out.txt')
for line in keys:
if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0':
continue
nums.append(int(line[6:8],16))
keys.close()
output = ""
for n in nums:
if n == 0 :
continue
if n in mappings:
output += mappings[n]
else:
output += '[unknown]'
print ('output :\n' + output)
拿到flag要格式化后才能交对
flag: ACECTF{y0u_h4v3_f0und_17}
Fractured Frames
这个题修改一些jpg的高度即可得到flag
flag: ACECTF{th1s_sh0uld_b3_en0u6h}
steganography
HeaderHijack
https://fix.video/
需要修复文件头,先找一个在线修复视频的网站,然后修复好就可以在视频中获得flag
flag: ACECTF{d3c0d3_h3x_1s_fun}
Cryptic Pixels
binwalk提取图片中有个加密的压缩包
需要用archpr工具和rockyou.txt字典来爆破来爆破
解压出来是一个类似flag的东西,但不是flag
随波逐流一把梭,得到flag
flag :ACECTF{h4h4_y0u’r3_5m4r7}