PolarCTF2024秋季个人挑战赛个人Writeup
Misc
文物追回
附件中提供了一段音频和一张图片,图片尾藏了一个压缩包,压缩包需要密码。
音频听取后发现是SSTV编码,解码后获得如下图片:
图片中包含的文本推测为压缩包的密码,使用“it’stooexpensive”作为密码解压获得如下文件:
在手机上安装base.apk,发现这个应用可以揭露图片中的隐藏信息。点击“Reveal the Message”,选择压缩包中的“文物.jpg”,并单击Reveal,得到下图页面。
可知隐藏的内容为9527ETC。同时这是文物的价格。
flag为flag{5ba2c63a15dcfecb5297f4688bfc6516}
Crypto
ao神之力
提示得知,附件中的文本采用了多次不同base编码。经过测试,Base91->Base16->Base64->Base16后得到明文woshi_Polar-aoshen
Base91结果:
Base16结果:
Base64结果:
Base16结果:
动物世界
打开后发现明显的熊曰。与熊论道解密:
明显的兽音译者,解密:
flag为flag{666666666}
僧人和小妖的爱情
分析文本可提取到有效信息两条:
分别采用了与佛论禅和兽音译者,解密如下图:
与佛论禅解密得:yuanmengzhixing。兽音译者解密得:qi_dong!!!
最后将两段文本拼接得出flag
Web
传马
可上传图片:
如果上传php文件,弹出下图提示
明显是一个前端校验,分析后在控制台输入:
checkFile = function(){return true}
绕过前端的文件后缀名检测
再次点击上传返回:
提示:文件类型不正确,请重新上传!
直接修改请求中的Content-Type
为image/png
,发送请求,即可绕过后端验证。
返回如下:
UPLOAD_PATH 存在: ./upload
上传文件类型: image/png
临时文件路径: /tmp/phpnJFNmi
目标路径: ./upload/muma.php
文件移动成功
蚁剑连接后在根目录发现flag.txt
笑傲上传
尝试上传一句话木马,同样有一个前端检测,同样控制台输入:
checkFile = function(){return true}
绕过前端的后缀名检测。
返回如下提示:
提示:文件未知,上传失败!
仿照上一题修改请求的Content-Type
,无法绕过。
已知可以上传图片,传个图片马试试。
上传成功。
但是后缀被修改为了.jpg
这里上传页面还有一个神秘链接,点进去发现是一个php文件的源码:
<?php
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
/*这里是妙妙屋的后门*/
?>
这里include了file参数提供的文件,我们把刚刚传上去的一句话木马的路径写进去。
例如路径:
include.php?file=./upload/8020240922020217.jpg
写进蚁剑中,同样在根目录找到flag.txt
非预期解
直接把flag.txt的路径传给include.php:
include.php?file=/flag.txt
Reverse
box
附件存在一个提示文本和一个ELF文件。根据提示文本,flag为ELF中获取的3个key拼接结果。
key1
key1反编译结果如下:
可以看到最后的全局变量key的结果应该是key1
这里需要注意的是IDA反编译存在问题:
汇编中可以清晰的看到,循环体中key
加的值是key + c
,而反编译中直接将f * d / 10的结果加给了key
在上一个for循环中可以看到c
的值是改变了的,如果直接按照IDA的反编译结果来编写代码,会导致最终算出的key
是错误的。
这里提供Python的一种实现:
c=0
d=0
f=0
key=0
for i in range(1,22):
c += i
d += c
f = d + c - 1
for k in range(33, 0, -1):
c = int(f * d) / 10
key += int(c)
print(key)
key1=11694441
key2
这里将输入字符串与程序内一个全局变量比较
变量值为that_ok
key2=that_ok
key3
强烈的base特征
Base32解码得:
key3=key
flag
flag=flag{md5(key1+key2+key3)}=flag{md5(11694441that_okkey)}=flag{0c680749b893e20d491a8752f1d49acd}
HowTo_Login
查壳发现有一层UPX,使用UPX -d 脱掉
发现WinMain调用了DialogBoxParamW
,进入过程函数,发现如下校验逻辑:
程序校验的序列号为CZ9dmq4c8g9G7bAX,同时也是本题目的flag。
语言不通禁止入内
附件是IDA生成的反汇编代码。先找到main函数,如下图:
发现这里将字符串传给了processString
函数
找到该函数:
该函数对传入的字符串逐字节进行了与6异或后减1的操作
Python实现:
str = [0x7E, 0x60, 0x62, 0x64, 0x69, 0x75, 0x60, 0x64, 0x63, 0x64, 0x72, 0x72, 0x60, 0x68, 0x65, 0x6B, 0x7C]
flag = ""
for i in range(len(str)):
flag += chr((str[i] ^ 6) - 1)
print(flag)
需要注意字节序问题和运算符优先级。
RE_jar
附件提供了一个Jar文件和一个后缀名为enc的文件。
反编译Jar文件主类的代码可以得知,附件提供的RE_jar-1.0-SNAPSHOT.jar实现了加密文件的功能。
KeyGenerator类仅有的一个方法返回了一个密钥,用于AES的密钥。
对GetAesKeyB64String方法的结尾处稍作修改,使其输出密钥:
(图中高亮处为添加代码)
执行得密钥:9FQxXBEE2GCG1Q+AzwVvZA==
(执行结果)
反编译FileEncryptor类,得知其加密方法及输出格式,如下图:
可知,加密采用了CBC模式。并且将IV写入了加密后的文件。
(加密后文件分析,以附件提供encrypted.enc为例)
分析加密后文件可知,IV为28A6059CFD4381D33B4EC46CD4680069。剩余字节为加密内容,将其丢进CyberChef进行Bake:
(CyberChef执行结果)
将输出内容作为16进制复制:
高亮部分为flag
bllbl_木马
解法1
根据附件提示,可对照出相关加载器代码:
这里是加载shellcode。
但由于shellcode所在区段没有执行权限,直接运行会崩溃,需要手动设置下页面保护属性才可调试。
之后对照另一个提示中的payload源码,可以找到如下位置。
这里有sockaddr结构体,同时这个结构体中包含了连接到的IP和端口。
对应该题目为,IP:0C 22 38 4E,转为十进制:12.34.56.78。
端口:038E,转为十进制:910。
该题flag为flag{md5(12.34.56.78:910)}=flag{922049c9d5e1bdce2545f973eb031850}
解法2
监控工具可监控到Connect行为。其中包含了目标IP及端口号。
两点半俱乐部
解法1
IDA中分析:
首先转到窗口过程函数中,向下找到如下代码:
这里校验了输入的通行证和卡密,调试器中分析到正确的通行证和卡密:
IDA中继续查看,发现这里还校验了点击次数,如果小于9999999还不会弹出flag:
这里可以修改内存数据,或者直接复制下方else中弹窗里包含的flag即可。
解法2
直接搜索字符串得flag:
(完)