首页
论坛
课程
招聘
[Reverse] [原创]2021虎符ctf(Re)-CrackMe
2021-4-9 20:58 2271

[Reverse] [原创]2021虎符ctf(Re)-CrackMe

2021-4-9 20:58
2271

CrackMe

题目及其ida分析文件下载链接:

链接:https://pan.baidu.com/s/1uI9Iltx5iTjjV74C068g9w提取码:0syj

直接找到main函数开始分析:

上面将我们输入的长度为17的flag,分为了7和10长度的两个部分

这里是再次输入一个值,然后进行验证。将输入的值/12379和%12379得到的两个值分别验证。

我们可以写脚本进行爆破:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//还原原题的function函数
double function(double a1, double a2)
{
    double temp = pow(a1, a2-1);
    double v3 = temp / exp(a1);
    return v3;
}
int main()
{
    //下面我们将两个值分开进行爆破
    int chu = 0;
    int data1 = 0;   //用于比较的第一个数据
    while(1) //爆破第一个整除12379的值
    {
        double v17 = 0.0;
        double v18 = 0.0;
        double v19 = (double)chu + 1.0;
        do
        {
            v17 = v17+function(v18,v19)*0.001;
            v18 = v18+0.001;
        }while(v18 <= 100.0);
        data1 = (int)(v17 + v17 + 3.0);
        if(data1 == 0x13B03)
        {
            printf("v96整除12379并向下取整的值为:%d",chu);
            break;
        }
        else
        {
            printf("data1 not allow\n");
        }
        chu++;
    }

    //爆破第二个%12379之后的值
    int data2 = 0; //用于比较的第二个值
    int yu = 0;
    for(;yu<12379;yu++)  //%12379得到的值自然不能超过12379
    {
        double v16 = 0.0;
        double v21 = 0.0;
        double v22 = (double)yu + 1.0;
        do
        {
            v16 = v16 + function(v21,v22)*0.001;
            v21 = v21 + 0.001;
        }while(v21 <= 100.0);
        data2 = (int)(v16 + v16 + 3.0);    //用于比较的第二个数据,是否等于0x5A2
        if(data2 == 0x5A2)
        {
            printf("\n模12379得到的值为: %d",yu);
            break;
        }
        else
        {
            printf("\ndata2 not allow");
        }
    }
    printf("\n所以最后得到的值为\n10进制表示:%d 16进制表示:%#x\n",(12379*(chu)+yu),(12379*(chu)+yu));
    return 0;
}

最后爆破得到的值位:99038


将后面10位进行RC4加密,然后进行比较

其实前7位动调得到用于异或的数据和比较的数据即可

后10位也是在最后一步RC4加密异或的地方得到进行异或的数据和最后进行比较的数据


上面动调得到了前7个用于异或的数据和比较的数据

下面我们动调得到RC4的数据

写出解题脚本:

# _*_ coding:utf-8 _*_
# @功能描述:
# @程序作者:SYJ
# @版权信息:Reversed By SYJ
# @版本信息:0.0.0
xor_1 = [0x39, 0x39, 0x30, 0x33, 0x38, 0x31, 0x39]
cmp_data1 = [0x08, 0x4D, 0x59, 0x06, 0x73, 0x02, 0x40]
flag = ''
for i in range(7):
    flag += chr(xor_1[i] ^ cmp_data1[i])
xor_2 = [0xe0, 0x95, 0xba, 0x60, 0xc9, 0x66, 0x2a, 0x24, 0xb2, 0x36]
cmp_data2 = [0xb2, 0xd6, 0x8e, 0x3f, 0xaa, 0x14, 0x53, 0x54, 0xc6, 0x6]
for i in range(10):
    flag += chr(xor_2[i] ^ cmp_data2[i])
print(flag)

最后解得:1ti5K3yRC4_crypt0



[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班火热招生!!

最后于 2021-4-22 17:21 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回