VNCTF2022的wp

排名第6,逆向没有AK,差一题(要不然就第二了),不过发现自己的不足也算是有进步。

CRYPTO:

ezmath

n取到直接乘4返回即可
在这里插入图片描述

MISC

问卷

仔细找找

图片中有间隔几乎相等的杂色点,写脚本取出:

from PIL import Image

img = Image.open(r'g:\share\20220212\flag.png')
w, h = img.size

res = Image.new('RGB', (w//50, h//31), 255)
for x in range(w):
    for y in range(h):
        p = img.getpixel((x, y))
        if p != (0, 0, 0):
            res.putpixel(((x-22)//50,(y-10)//31), p)

res.save(r'g:\share\20220212\flag2.png')

在这里插入图片描述
得到flag:vnctf{34aE@w}

Strange flag

在这里插入图片描述

可以看到返回报文中的目录结构比较奇怪,每个目录分2个子目录,每个子目录又分4个目录,其中的目录有子目录的可以考虑成1,没有子目录的考虑为0
这样可以得到一串HEX值
在这里插入图片描述

得到flag

REVERSE

BABYMAZE

用pydisasm反汇编pyc,可以看到如下的变量初始化
在这里插入图片描述
提取出来,按每行31列展示如下:
在这里插入图片描述
在这里插入图片描述
输入asdw为方向键,手工写出解答:
ssssddssaassddddwwwwddwwddddddwwddddddssddwwddddddddssssaawwaassaassaassddssaassaawwwwwwaaaaaaaassaassddddwwddssddssssaassddssssaaaaaawwddwwaawwwwaassssssssssssddddssddssddddddddwwaaaaaawwwwddssddwwwwwwwwddssddssssssssddddss
得到flag
在这里插入图片描述

CM1

这题赛后才做出来,因是对dex文件加密算法理解的偏差,导致解密后的文件内容部分不对
ooo文件是加密的dex,加密算法就是异或
在这里插入图片描述

这里我直接想当然的就把整个文件用nv2022异或了,后来才意识到1024不能被6整除。
用模拟器dump出来的dex可以正常看到源码
在这里插入图片描述

然后就是xxtea直接解密
在这里插入图片描述

CM狗

虚拟机,代码如下:
在这里插入图片描述

分析函数列表:
在这里插入图片描述
写脚本模拟虚拟机运行,打印函数功能列表:

code=[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x57, 0x62, 0x00, 0x00, 0x01, 0x00, 0x65, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6C, 0x62, 0x00, 0x00, 0x01, 0x00, 0x63, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6F, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6D, 0x62, 0x00, 0x00, 0x01, 0x00, 0x65, 0x62, 0x00, 0x00, 0x01, 0x00, 0x20, 0x62, 0x00, 0x00, 0x01, 0x00, 0x74, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6F, 0x62, 0x00, 0x00, 0x01, 0x00, 0x20, 0x62, 0x00, 0x00, 0x01, 0x00, 0x56, 0x62, 0x00, 0x00, 0x01, 0x00, 0x4E, 0x62, 0x00, 0x00, 0x01, 0x00, 0x43, 0x62, 0x00, 0x00, 0x01, 0x00, 0x54, 0x62, 0x00, 0x00, 0x01, 0x00, 0x46, 0x62, 0x00, 0x00, 0x01, 0x00, 0x32, 0x62, 0x00, 0x00, 0x01, 0x00, 0x30, 0x62, 0x00, 0x00, 0x01, 0x00, 0x32, 0x62, 0x00, 0x00, 0x01, 0x00, 0x32, 0x62, 0x00, 0x00, 0x01, 0x00, 0x21, 0x62, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x62, 0x00, 0x00, 0x01, 0x00, 0x69, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6E, 0x62, 0x00, 0x00, 0x01, 0x00, 0x70, 0x62, 0x00, 0x00, 0x01, 0x00, 0x75, 0x62, 0x00, 0x00, 0x01, 0x00, 0x74, 0x62, 0x00, 0x00, 0x01, 0x00, 0x20, 0x62, 0x00, 0x00, 0x01, 0x00, 0x66, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6C, 0x62, 0x00, 0x00, 0x01, 0x00, 0x61, 0x62, 0x00, 0x00, 0x01, 0x00, 0x67, 0x62, 0x00, 0x00, 0x01, 0x00, 0x3A, 0x62, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x62, 0x00, 0x00, 0x01, 0x13, 0x49, 0x01, 0x03, 0x00, 0x01, 0x01, 0x2B, 0x01, 0x02, 0x01, 0x61, 0x00, 0x00, 0x05, 0x00, 0x00, 0x08, 0x01, 0x02, 0x0E, 0x01, 0x03, 0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x06, 0x00, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x0A, 0x00, 0x05, 0x02, 0x06, 0x00, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x02, 0x00, 0x06, 0x0A, 0x00, 0x05, 0x02, 0x06, 0x00, 0x06, 0x00, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x07, 0x00, 0x06, 0x00, 0x00, 0x07, 0x07, 0x00, 0x02, 0x00, 0x07, 0x0A, 0x00, 0x05, 0x02, 0x07, 0x00, 0x06, 0x00, 0x00, 0x07, 0x07, 0x00, 0x02, 0x00, 0x07, 0x0A, 0x00, 0x05, 0x02, 0x07, 0x00, 0x06, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x08, 0x00, 0x06, 0x00, 0x00, 0x07, 0x08, 0x00, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x05, 0x02, 0x08, 0x00, 0x06, 0x00, 0x00, 0x07, 0x08, 0x00, 0x02, 0x00, 0x08, 0x0A, 0x00, 0x05, 0x02, 0x08, 0x00, 0x06, 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x09, 0x00, 0x06, 0x00, 0x00, 0x07, 0x09, 0x00, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x05, 0x02, 0x09, 0x00, 0x06, 0x00, 0x00, 0x07, 0x09, 0x00, 0x02, 0x00, 0x09, 0x0A, 0x00, 0x05, 0x02, 0x09, 0x00, 0x06, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0A, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0A, 0x00, 0x02, 0x00, 0x0A, 0x0A, 0x00, 0x05, 0x02, 0x0A, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0A, 0x00, 0x02, 0x00, 0x0A, 0x0A, 0x00, 0x05, 0x02, 0x0A, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0B, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0B, 0x00, 0x02, 0x00, 0x0B, 0x0A, 0x00, 0x05, 0x02, 0x0B, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0B, 0x00, 0x02, 0x00, 0x0B, 0x0A, 0x00, 0x05, 0x02, 0x0B, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x02, 0x00, 0x0C, 0x0A, 0x00, 0x05, 0x02, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x02, 0x00, 0x0C, 0x0A, 0x00, 0x05, 0x02, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0D, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0D, 0x00, 0x02, 0x00, 0x0D, 0x0A, 0x00, 0x05, 0x02, 0x0D, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0D, 0x00, 0x02, 0x00, 0x0D, 0x0A, 0x00, 0x05, 0x02, 0x0D, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x0A, 0x00, 0x05, 0x02, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x0A, 0x00, 0x05, 0x02, 0x0E, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x02, 0x00, 0x0F, 0x0A, 0x00, 0x05, 0x02, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x02, 0x00, 0x0F, 0x0A, 0x00, 0x05, 0x02, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x00000100, 0x0A, 0x00, 0x05, 0x02, 0x10, 0x00, 0x06, 0x00, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x05, 0x02, 0x10, 0x00, 0x06, 0x00, 0x00, 0x07, 0x10, 0x00, 0x02, 0x00, 0x10, 0x0A, 0x00, 0x05, 0x02, 0x10, 0x00, 0x06, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x00, 0x05, 0x07, 0x00, 0x05, 0x08, 0x00, 0x05, 0x09, 0x00, 0x05, 0x0A, 0x00, 0x05, 0x0B, 0x00, 0x05, 0x0C, 0x00, 0x05, 0x0D, 0x00, 0x05, 0x0E, 0x00, 0x05, 0x0F, 0x00, 0x05, 0x10, 0x00, 0x06, 0x01, 0x00, 0x06, 0x02, 0x00, 0x01, 0x14, 0x0000011C, 0x01, 0x00, 0x00000154, 0x0C, 0x00, 0x00, 0x01, 0x00, 0xE8D1D5DF, 0x01, 0x13, 0x00000183, 0x01, 0x14, 0x00000153, 0x0E, 0x01, 0x00, 0x01, 0x00, 0xF5E3C114, 0x0E, 0x02, 0x00, 0x06, 0x01, 0x00, 0x06, 0x02, 0x00, 0x01, 0x14, 0x00000127, 0x01, 0x00, 0x00000154, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x228EC216, 0x01, 0x13, 0x00000183, 0x01, 0x14, 0x00000153, 0x0E, 0x01, 0x00, 0x01, 0x00, 0x89D45A61, 0x0E, 0x02, 0x00, 0x06, 0x01, 0x00, 0x06, 0x02, 0x00, 0x01, 0x14, 0x00000132, 0x01, 0x00, 0x00000154, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x655B8F69, 0x01, 0x13, 0x00000183, 0x01, 0x14, 0x00000153, 0x0E, 0x01, 0x00, 0x01, 0x00, 0x2484A07A, 0x0E, 0x02, 0x00, 0x06, 0x01, 0x00, 0x06, 0x02, 0x00, 0x01, 0x14, 0x0000013D, 0x01, 0x00, 0x00000154, 0x0C, 0x00, 0x00, 0x01, 0x00, 0xD9E5E7F8, 0x01, 0x13, 0x00000183, 0x01, 0x14, 0x00000153, 0x0E, 0x01, 0x00, 0x01, 0x00, 0x3A441532, 0x0E, 0x02, 0x00, 0x06, 0x01, 0x00, 0x06, 0x02, 0x00, 0x01, 0x14, 0x00000148, 0x01, 0x00, 0x00000154, 0x0C, 0x00, 0x00, 0x01, 0x00, 0x91AB7E88, 0x01, 0x13, 0x00000183, 0x01, 0x14, 0x00000153, 0x0E, 0x01, 0x00, 0x01, 0x00, 0x69FC64BC, 0x0E, 0x02, 0x00, 0x06, 0x01, 0x00, 0x01, 0x00, 0x007D3765, 0x0E, 0x01, 0x00, 0x01, 0x00, 0x00000189, 0x0C, 0x00, 0x00, 0x63, 0x00, 0x00, 0x01, 0x03, 0x9E3779B9, 0x01, 0x04, 0x00095C4C, 0x01, 0x05, 0x0000871D, 0x01, 0x06, 0x0001A7B7, 0x01, 0x07, 0x0012C7C7, 0x01, 0x08, 0x00, 0x01, 0x11, 0x10, 0x01, 0x12, 0x20, 0x01, 0x13, 0x00000160, 0x01, 0x0A, 0x00, 0x01, 0x0B, 0x20, 0x01, 0x0C, 0x01, 0x07, 0x08, 0x03, 0x02, 0x00, 0x02, 0x0A, 0x00, 0x11, 0x07, 0x00, 0x04, 0x02, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x07, 0x00, 0x08, 0x02, 0x0F, 0x00, 0x02, 0x00, 0x02, 0x09, 0x00, 0x12, 0x07, 0x00, 0x05, 0x02, 0x10, 0x00, 0x02, 0x00, 0x0E, 0x0B, 0x00, 0x0F, 0x0B, 0x00, 0x10, 0x07, 0x01, 0x00, 0x02, 0x00, 0x01, 0x0A, 0x00, 0x11, 0x07, 0x00, 0x06, 0x02, 0x0E, 0x00, 0x02, 0x00, 0x01, 0x07, 0x00, 0x08, 0x02, 0x0F, 0x00, 0x02, 0x00, 0x01, 0x09, 0x00, 0x12, 0x07, 0x00, 0x07, 0x02, 0x10, 0x00, 0x02, 0x00, 0x0E, 0x0B, 0x00, 0x0F, 0x0B, 0x00, 0x10, 0x07, 0x02, 0x00, 0x08, 0x0B, 0x0C, 0x0E, 0x0B, 0x0A, 0x0C, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6E, 0x62, 0x00, 0x00, 0x01, 0x00, 0x6F, 0x62, 0x00, 0x00, 0x0C, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0x62, 0x00, 0x00, 0x01, 0x00, 0x65, 0x62, 0x00, 0x00, 0x01, 0x00, 0x73, 0x62, 0x00, 0x00, 0x0C, 0x14, 0x00]

calllist=['nop','load','copy','returnN','enterN','push','pop','add','sub','divide','multiply','xor','jump','ifequ','ifneq','iflt','ifgt']
funlist={}
for i,e in enumerate(calllist):
    funlist[i]=e
funlist[0x61]='getinput'
funlist[0x62]='output'
funlist[0x63]='quit'

rip=0
while(rip<len(code)-1):
    instr=code[rip]
    print(hex(rip//3),funlist[instr],hex(code[rip+1]),hex(code[rip+2]))
    rip+=3

在这里插入图片描述

可以看出是标准的TEA算法
在这里插入图片描述
这里是比较最后3个字节是不是’e7}’

合起来得到flag

时空飞行

第一部分判断输入时间
在这里插入图片描述

核心函数:
在这里插入图片描述
根据输入的字符,顺序生成32个dword,比较最后的4个dword是否一致。
写出逆向脚本:

import struct
def ROL(data, n, length):
    shift = data << n
    shift &= (2**length-1)
    carry = data >> (length - n)
    return shift | carry
def ROR(data, n, length):
    shift = data >> n
    carry = data << (length - n)
    carry &= (2**length-1)
    return shift | carry
res=[0xFD07C452, 0xEC90A488, 0x68D33CD1, 0x96F64587]
key=[0xA3B1BAC6,0x56AA3350,0x677D9197,0xB27022DC]
xor=[0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269, 0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9, 0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249, 0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9, 0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229, 0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299, 0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209, 0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279]

a=[0]*32
a+=res
for i in range(31,-1,-1):
    x=a[i+3]^a[i+2]^a[i+1]^xor[i]
    a[i]=ROL(x,13,32)^ROR(x,9,32)^x^a[i+4]
    if i<4:
        print(struct.pack('>I',a[i]^key[i]))

在这里插入图片描述
得到日期为20211205
第二段验证flag,和前面的算法雷同,都是可以倒推得到前面输入的值:
在这里插入图片描述

写出逆向脚本:

res=[0x00000025, 0x00000015, 0x000000DF, 0x000000A2, 0x000000C0, 0x00000093, 0x000000AD, 0x00000014, 0x00000046, 0x000000C5, 0x0000000F, 0x0000002E, 0x0000009A, 0x000000EB, 0x00000030, 0x000000F8, 0x00000020, 0x000000E9, 0x000000CB, 0x00000088, 0x000000C6, 0x000000BE, 0x0000008D, 0x000000E3]
#res=[0x000001CB, 0x000000D6, 0x000000D8, 0x000000BB, 0x000000F0, 0x000000A6, 0x000000C2, 0x000001F5, 0x00000058, 0x00000007, 0x0000000A, 0x00000026, 0x00000089, 0x000000E2, 0x0000001F, 0x00000118, 0x0000001D, 0x000000DD, 0x000000FA, 0x0000007C, 0x000000EF, 0x000000B7, 0x00000161, 0x000000FF]

xorkey=[0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000]

def check(a1):
    v4=list(a1)
    for i in range(1,24):
        v4[i - 1] ^= (v4[i - 1] % 18 + v4[i] + 5) ^ 0x41
    for i in range(24):
        if v4[i]!=res[i]:
            return False
    else:
        return True

def encrypt(res):
    flag=[0]*66
    for i in range(6):
        flag[i]=(res[i*4]<<24)+(res[i*4+1]<<16)+(res[i*4+2]<<8)+(res[i*4+3])
    for i in range(6,66):
        if i%6==0:
            flag[i]=flag[i-6]^ROL(flag[i-1],8,32)^xorkey[i//6-1]
        else:
            flag[i]=flag[i-6]^flag[i-1]
    for i in range(60,66):
        print(hex(flag[i]))
ret=list(res)
pos=len(res)-1
x=0
while(pos>0):
    while(x<256):
        y=x^(x%18+ret[pos]+5)^0x41
        if res[pos-1]==y:
            ret[pos-1]=x
            #print('found',pos)
            pos-=1
            x=0
            break
        x+=1
    if x>=256:
        pos+=1
        if pos>len(res)-1:
            break
        x=ret[pos-1]+1
        ret[pos-1]=res[pos-1]
        continue
    if pos==0:
        x=ret[0]+1
        pos+=1
        #print(check(ret),ret)

        flag=[0]*66
        for i in range(6):
            flag[60+i]=(ret[i*4+3]<<24)+(ret[i*4+2]<<16)+(ret[i*4+1]<<8)+(ret[i*4])
        for i in range(66):
            if flag[i]>2**32:
                print(i)
        for i in range(65,5,-1):
            if i%6==0:
                flag[i-6]=flag[i]^ROL(flag[i-1],8,32)^xorkey[i//6-1]
            else:
                flag[i-6]=flag[i]^flag[i-1]
        getkey=(struct.pack('>6I',flag[0],flag[1],flag[2],flag[3],flag[4],flag[5]))
        print(getkey)

在这里插入图片描述
判断倒数第三个应该是正确输入
在这里插入图片描述
得到flag

WEB

GameV4.0

载入游戏页面,F12打开控制台,搜索FLAG关卡:
在这里插入图片描述

base64解密后得到flag:

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值