文章目录
- controlflow
- 1. 异或0x401
- 2. 加i*i
- 3. 异或i*(i+1)
- 4. 减i
- 5. 乘3
- 6. swap
- 7. judge
- 解题脚本
- webserver
- 1.关键函数
- 2. 求约束条件
- 3.Z3求解
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}