TEA
放到detectit看一下文件
MFC类型
微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
直接查看字符串
看到一个 flag正确
可以选择直接过去查看函数
F5直接看伪代码
上图是该段代码最重要的部分
在这里,应该学习一下,这个是tea密码
(有空再来更新一下tea密码,电脑快没电了,逃
最后要和程序里的代码比较一下
最后贴上解密代码
`#include<stdio.h>
void decrypt(unsigned int v, unsigned int *k)
{
unsigned int v0 = v[0], v1 = v[1], sum = 0xc6ef3720, i;
unsigned int delta = 0x9e3779b9;
unsigned int k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (i = 0;i < 32;i++)
{
v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
sum -= delta;
}
v[0] = v0;
v[1] = v1;
}
int main()
{
unsigned int key[4] = { 1634103412,825438253,792290103,593654333 };
unsigned int fis[8] = { 2287891615,1585311399,1546078125,467622186,705539630,739426750,3404744146,2450907267 };
int j;
for (j = 0; j < 4; j++)
{
decrypt(&fis[j * 2], key);
}
int i;
for (i = 0; i < 32; i++)
{
printf(“%c”, *(((char)fis) + i));
}
system(“pause”);
}`
(有空更新一下pyhton的解密代码吧,这里先把ctfwiki上介绍的tea贴上去
https://ctf-wiki.github.io/ctf-wiki/reverse/Identify-Encode-Encryption/introduction-zh/
secret
放到detectit,如下:
先查看主函数里的内容
需要仔细研究的函数有checktime(),check(&s),run(&s),key(&s,90)应该是对字符串的输入
先来查看checktime()
这个应该算是方程组的求解可以算出来对应的值(要用线代,但也可以不用,建议尝试z3求解器,真的是神器)
看一下求解的代码
from z3 import *
solver = Solver()
v4 = Int('v4')
v5 = Int('v5')
v6 = Int('v6')
v7 = Int('v7')
v8 = Int('v8')
v9 = Int('v9')
v10 = Int('v10')
v11 = Int('v11')
solver.add(14766 * v10 + 18242 * v9 + 4657 * v8 + 22453 * v7 + 7236 * v6 + 28554 * v5 + 25606 * v4 + 12289 * v11 == 12977737)
solver.add(27429 * v10 + 8015 * v9 + 16511 * v8 + 17180 * v7 + 27141 * v6 + 31813 * v5 + 7412 * v4 + 18249 * v11 == 15081473)
solver.add(2846 * v10 + 28353 * v9 + 19864 * v8 + 27377 * v7 + 9006 * v6 + 13657 * v5 + 19099 * v4 + 25835 * v11 == 13554960)
solver.add(1078 * v10 + 5007 * v9 + 6568 * v8 + 23034 * v7 + 10150 * v6 + 22949 * v5 + 32646 * v4 + 15255 * v11 == 11284005)
solver.add(8010 * v10 + 15430 * v9 + 6657 * v8 + 1009 * v7 + 25691 * v6 + 15960 * v5 + 19493 * v4 + 29491 * v11 == 10759932)
solver.add(4605 * v10 + 14468 * v9 + 5017 * v8 + 12805 * v7 + 22973 * v6 + 30584 * v5 + 12620 * v4 + 32085 * v11 == 12085266)
solver.add(7478 * v10 + 6524 * v9 + 25994 * v8 + 16215 * v7 + 12864 * v6 + 20574 * v5 + 8882 * v4 + 14794 * v11 == 11323393)
solver.add(15263 * v10 + 8821 * v9 + 25489 * v8 + 9598 * v7 + 26847 * v6 + 5175 * v5 + 6515 * v4 + 27411 * v11 == 11677607)
if solver.check() == sat:
m = solver.model()
print(m)
算出来的答案
v6 = 97
v5 = 108
v7 = 103
v4 = 102
v8 = 123
v10 = 104
v11 = 51
v9 = 84
可以转成字符串先看一下,flag{Th3,应该是flag的前几位
这里也咕咕一下,留空准备介绍下z3的学习
再来看一下check(&s)函数
这个算法必须看会,这个类似base64编码,这个是base58(可我为什么感觉这两编码的代码差别好大,看来要学习一下了)
可以用网上的base58编码解码把给的数转换一下。_sEcond_Be5t_Time_1s_n0w}
结束