DASCTF 2023 & 0X401七月暑期挑战赛 Reverse部分题解

controlflow

动态调试观察执行情况

1. 异或0x401

请添加图片描述

2. 加i*i

请添加图片描述

3. 异或i*(i+1)

注意这里是从data[10+i]开始
请添加图片描述

4. 减i

请添加图片描述

5. 乘3

请添加图片描述

6. swap

注意这里是从data[10+i]开始
请添加图片描述

7. judge

进行数据比较并解密输出的两个字符串

请添加图片描述

解题脚本

#include<stdio.h>
int main() {
    
    
	unsigned int data[40] = {
    
     0 };
	data[0] = 3279;
	data[1] = 3264;
	data[2] = 3324;
	data[3] = 3288;
	data[4] = 3363;
	data[5] = 3345;
	data[6] = 3528;
	data[7] = 3453;
	data[8] = 3498;
	data[9] = 3627;
	data[10] = 3708;
	data[11] = 3675;
	data[12] = 3753;
	data[13] = 3786;
	data[14] = 3930;
	data[15] = 3930;
	data[16] = 4017;
	data[17] = 4173;
	data[18] = 4245;
	data[19] = 4476;
	data[20] = 4989;
	data[21] = 4851;
	data[22] = 5166;
	data[23] = 5148;
	data[24] = 4659;
	data[25] = 4743;
	data[26] = 4596;
	data[27] = 5976;
	data[28] = 5217;
	data[29] = 4650;
	data[30] = 6018;
	data[31] = 6135;
	data[32] = 6417;
	data[33] = 6477;
	data[34] = 6672;
	data[35] = 6891;
	data[36] = 7056;
	data[37] = 7398;
	data[38] = 7650;
	data[39] = 7890;
	for (int i = 0; i < 20; i += 2) {
    
    
		data[10 + i] ^= data[10 + i + 1];
		data[10 + i + 1] ^= data[10 + i];
		data[10 + i] ^= data[10 + i + 1];
	}
	for (int i = 0; i < 40; i++)
		data[i] /= 3;
	for (int i = 0; i < 40; i++)
		data[i] += i;
	for (int i = 0; i < 20; i++) 
		data[10+i] ^= i * (i + 1);
	for (int i = 0; i < 40; i++) 
		data[i] -= i * i;
	for (int i = 0; i < 40; i++)
		data[i] ^= 0x401;
	for (int i = 0; i < 40; i++)
		printf("%c",data[i]);
	//DASCTF{TWpnemRuSTRkVzVsWVhOMmJqZzNOREoy}
	return 0;
}

webserver

1.关键函数

主函数发现不了什么,于是在函数列表逐个探查函数,最终找到一个可疑函数有赋值和矩阵乘法

这里的input定义为QWORD[24] 实际上前4个单元(4*8=32字节)没有被使用,后20个QWORD在循环时强转成DWORD(即40个单元),所以input是个4行10列矩阵,并且每行10个DWORD(实际有效内容仅1Byte)

第一个循环是进行矩阵乘法并修改data,第二个大循环是检查data是否为零矩阵,也就是说经过第一个大循环运算后data应该全0

请添加图片描述

2. 求约束条件

根据矩阵乘法求约束条件

#include<stdio.h>

int main() {
    
    
    unsigned char buffer[400] =
    {
    
    
      0x17, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x04, 0x00,
      0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
      0x29, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x21, 0x00,
      0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
      0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0D, 0x00,
      0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00,
      0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x00,
      0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00,
      0x38, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x3E, 0x00,
      0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00,
      0x3F, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x44, 0x00,
      0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
      0x5C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x10, 0x00,
      0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
      0x03, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x47, 0x00,
      0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
      0x40, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x47, 0x00,
      0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00,
      0x59, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x44, 0x00,
      0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00,
      0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x34, 0x00,
      0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x2C, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x20, 0x00,
      0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00,
      0x14, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x02, 0x00,
      0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      0x39, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x2B, 0x00,
      0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00,
      0x50, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x5D, 0x00,
      0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00,
      0x4A, 0x00, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x2D, 0x00,
      0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
      0x01, 0x00, 0x00, 0x00, 0x63, 0x00, 0x00, 0x00, 0x1E, 0x00,
      0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
      0x01, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x4D, 0x00,
      0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
      0x25, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x3C, 0x00,
      0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
      0x4F, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x57, 0x00,
      0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00
    };
	unsigned int data[40] = {
    
     0 };
    data[0] = 33211;
    data[1] = 36113;
    data[2] = 28786;
    data[3] = 44634;
    data[4] = 30174;
    data[5] = 39163;
    data[6] = 34923;
    data[7] = 44333;
    data[8] = 33574;
    data[9] = 23555;
    data[10] = 35015;
    data[11] = 42724;
    data[12] = 34160;
    data[13] = 49166;
    data[14] = 35770;
    data[15] = 45984;
    data[16] = 39754;
    data[17] = 51672;
    data[18] = 38323;
    data[19] = 27511;
    data[20] = 31334;
    data[21] = 34214;
    data[22] = 28014;
    data[23] = 41090;
    data[24] = 29258;
    data[25] = 37905;
    data[26] = 33777;
    data[27] = 39812;
    data[28] = 29442;
    data[29] = 22225;
    data[30] = 30853;
    data[31] = 35330;
    data[32] = 30393;
    data[33] = 41247;
    data[34] = 30439;
    data[35] = 39434;
    data[36] = 31587;
    data[37] = 46815;
    data[38] = 35205;
    data[39] = 0x50D1;

    unsigned int input[40] = {
    
     0 };
    int k, m, n;
    unsigned int* mulbuf = (unsigned int*)buffer;
    for (k = 0; k <= 3; ++k)                // 矩阵乘法
    {
    
    
        for (m = 0; m <= 9; ++m)
        {
    
    
            printf("s.add(");
            for (n = 0; n <= 9; ++n)
            {
    
    
                if (n != 9)
                    printf("input[%d]*%d+", k*10+n, mulbuf[10 * n + m]);
                else
                    printf("input[%d]*%d", k * 10+ n, mulbuf[10 * n + m]);
            }
            printf("==%d)\n",data[10*k+m]);
               
        }
    }
	return 0;
}

3.Z3求解

from z3 import *
input=[BitVec('flag[%d]'%i,8)for i in range(40)]
s=Solver()
for i in input:
    s.add(i>=32,i<=127)
s.add(input[0]*23+input[1]*69+input[2]*56+input[3]*92+input[4]*64+input[5]*16+input[6]*20+input[7]*80+input[8]*1+input[9]*37==33211)
s.add(input[0]*13+input[1]*1+input[2]*19+input[3]*12+input[4]*83+input[5]*16+input[6]*63+input[7]*92+input[8]*99+input[9]*67==36113)
s.add(input[0]*4+input[1]*13+input[2]*62+input[3]*16+input[4]*71+input[5]*52+input[6]*2+input[7]*93+input[8]*30+input[9]*60==28786)
s.add(input[0]*48+input[1]*45+input[2]*70+input[3]*64+input[4]*52+input[5]*43+input[6]*99+input[7]*58+input[8]*28+input[9]*54==44634)
s.add(input[0]*41+input[1]*41+input[2]*23+input[3]*31+input[4]*99+input[5]*0+input[6]*0+input[7]*84+input[8]*56+input[9]*51==30174)
s.add(input[0]*41+input[1]*64+input[2]*63+input[3]*3+input[4]*89+input[5]*44+input[6]*57+input[7]*74+input[8]*1+input[9]*79==39163)
s.add(input[0]*42+input[1]*8+input[2]*30+input[3]*17+input[4]*76+input[5]*50+input[6]*79+input[7]*81+input[8]*12+input[9]*38==34923)
s.add(input[0]*33+input[1]*80+input[2]*68+input[3]*71+input[4]*68+input[5]*32+input[6]*43+input[7]*45+input[8]*77+input[9]*87==44333)
s.add(input[0]*30+input[1]*15+input[2]*17+input[3]*58+input[4]*1+input[5]*50+input[6]*71+input[7]*55+input[8]*92+input[9]*48==33574)
s.add(input[0]*3+input[1]*42+input[2]*56+input[3]*9+input[4]*99+input[5]*31+input[6]*19+input[7]*21+input[8]*4+input[9]*16==23555)
s.add(input[10]*23+input[11]*69+input[12]*56+input[13]*92+input[14]*64+input[15]*16+input[16]*20+input[17]*80+input[18]*1+input[19]*37==35015)
s.add(input[10]*13+input[11]*1+input[12]*19+input[13]*12+input[14]*83+input[15]*16+input[16]*63+input[17]*92+input[18]*99+input[19]*67==42724)
s.add(input[10]*4+input[11]*13+input[12]*62+input[13]*16+input[14]*71+input[15]*52+input[16]*2+input[17]*93+input[18]*30+input[19]*60==34160)
s.add(input[10]*48+input[11]*45+input[12]*70+input[13]*64+input[14]*52+input[15]*43+input[16]*99+input[17]*58+input[18]*28+input[19]*54==49166)
s.add(input[10]*41+input[11]*41+input[12]*23+input[13]*31+input[14]*99+input[15]*0+input[16]*0+input[17]*84+input[18]*56+input[19]*51==35770)
s.add(input[10]*41+input[11]*64+input[12]*63+input[13]*3+input[14]*89+input[15]*44+input[16]*57+input[17]*74+input[18]*1+input[19]*79==45984)
s.add(input[10]*42+input[11]*8+input[12]*30+input[13]*17+input[14]*76+input[15]*50+input[16]*79+input[17]*81+input[18]*12+input[19]*38==39754)
s.add(input[10]*33+input[11]*80+input[12]*68+input[13]*71+input[14]*68+input[15]*32+input[16]*43+input[17]*45+input[18]*77+input[19]*87==51672)
s.add(input[10]*30+input[11]*15+input[12]*17+input[13]*58+input[14]*1+input[15]*50+input[16]*71+input[17]*55+input[18]*92+input[19]*48==38323)
s.add(input[10]*3+input[11]*42+input[12]*56+input[13]*9+input[14]*99+input[15]*31+input[16]*19+input[17]*21+input[18]*4+input[19]*16==27511)
s.add(input[20]*23+input[21]*69+input[22]*56+input[23]*92+input[24]*64+input[25]*16+input[26]*20+input[27]*80+input[28]*1+input[29]*37==31334)
s.add(input[20]*13+input[21]*1+input[22]*19+input[23]*12+input[24]*83+input[25]*16+input[26]*63+input[27]*92+input[28]*99+input[29]*67==34214)
s.add(input[20]*4+input[21]*13+input[22]*62+input[23]*16+input[24]*71+input[25]*52+input[26]*2+input[27]*93+input[28]*30+input[29]*60==28014)
s.add(input[20]*48+input[21]*45+input[22]*70+input[23]*64+input[24]*52+input[25]*43+input[26]*99+input[27]*58+input[28]*28+input[29]*54==41090)
s.add(input[20]*41+input[21]*41+input[22]*23+input[23]*31+input[24]*99+input[25]*0+input[26]*0+input[27]*84+input[28]*56+input[29]*51==29258)
s.add(input[20]*41+input[21]*64+input[22]*63+input[23]*3+input[24]*89+input[25]*44+input[26]*57+input[27]*74+input[28]*1+input[29]*79==37905)
s.add(input[20]*42+input[21]*8+input[22]*30+input[23]*17+input[24]*76+input[25]*50+input[26]*79+input[27]*81+input[28]*12+input[29]*38==33777)
s.add(input[20]*33+input[21]*80+input[22]*68+input[23]*71+input[24]*68+input[25]*32+input[26]*43+input[27]*45+input[28]*77+input[29]*87==39812)
s.add(input[20]*30+input[21]*15+input[22]*17+input[23]*58+input[24]*1+input[25]*50+input[26]*71+input[27]*55+input[28]*92+input[29]*48==29442)
s.add(input[20]*3+input[21]*42+input[22]*56+input[23]*9+input[24]*99+input[25]*31+input[26]*19+input[27]*21+input[28]*4+input[29]*16==22225)
s.add(input[30]*23+input[31]*69+input[32]*56+input[33]*92+input[34]*64+input[35]*16+input[36]*20+input[37]*80+input[38]*1+input[39]*37==30853)
s.add(input[30]*13+input[31]*1+input[32]*19+input[33]*12+input[34]*83+input[35]*16+input[36]*63+input[37]*92+input[38]*99+input[39]*67==35330)
s.add(input[30]*4+input[31]*13+input[32]*62+input[33]*16+input[34]*71+input[35]*52+input[36]*2+input[37]*93+input[38]*30+input[39]*60==30393)
s.add(input[30]*48+input[31]*45+input[32]*70+input[33]*64+input[34]*52+input[35]*43+input[36]*99+input[37]*58+input[38]*28+input[39]*54==41247)
s.add(input[30]*41+input[31]*41+input[32]*23+input[33]*31+input[34]*99+input[35]*0+input[36]*0+input[37]*84+input[38]*56+input[39]*51==30439)
s.add(input[30]*41+input[31]*64+input[32]*63+input[33]*3+input[34]*89+input[35]*44+input[36]*57+input[37]*74+input[38]*1+input[39]*79==39434)
s.add(input[30]*42+input[31]*8+input[32]*30+input[33]*17+input[34]*76+input[35]*50+input[36]*79+input[37]*81+input[38]*12+input[39]*38==31587)
s.add(input[30]*33+input[31]*80+input[32]*68+input[33]*71+input[34]*68+input[35]*32+input[36]*43+input[37]*45+input[38]*77+input[39]*87==46815)
s.add(input[30]*30+input[31]*15+input[32]*17+input[33]*58+input[34]*1+input[35]*50+input[36]*71+input[37]*55+input[38]*92+input[39]*48==35205)
s.add(input[30]*3+input[31]*42+input[32]*56+input[33]*9+input[34]*99+input[35]*31+input[36]*19+input[37]*21+input[38]*4+input[39]*16==20689)

if s.check()==sat:
    print(s.model())

flag=[i for i in range(40)]

flag[26]=112
flag[0]=68
flag[2]=83
flag[16]=118
flag[18]=97
flag[20]=67
flag[23]=50
flag[13]=53
flag[5]=70
flag[4]=84
flag[15]=105
flag[1]=65
flag[21]=53
flag[27]=83
flag[30]=76
flag[32]=53
flag[31]=83
flag[34]=53
flag[37]=53
flag[7]=67
flag[8]=73
flag[9]=53
flag[24]=86
flag[25]=53
flag[38]=89
flag[11]=67
flag[14]=112
flag[28]=50
flag[6]=123
flag[29]=54
flag[19]=97
flag[17]=53
flag[36]=69
flag[12]=77
flag[33]=53
flag[10]=90
flag[39]=125
flag[35]=113
flag[22]=76
flag[3]=67

for i in flag:
    print(chr(i),end='')
#DASCTF{CI5ZCM5piv5aaC5L2V5pS26LS555qE5Y}

猜你喜欢

转载自blog.csdn.net/OrientalGlass/article/details/131878595