首页
社区
课程
招聘
[原创]KCTF2022 第二题pizzatqqql队题解
发表于: 2022-5-12 16:18 14804

[原创]KCTF2022 第二题pizzatqqql队题解

2022-5-12 16:18
14804

输入一段字符串,然后用输入的字符串在下图进行一系列运算后,将运算的结果存入v39之中,然后进行一个sbox的初始化,和输入没有半毛钱关系,每次运行都是相同的数,所以可以动调然后取出。
图片描述

接着用sbox和我们的输入进行了一系列运算,将结果存进int类型的v11中。

图片描述

接下来是一个常规的字符串转数字存入内存的函数,不过这里的ascii大于0x39的字符是减55后存入内存。

图片描述

然后下图的最下面的if判断需要满足,否则game over。向上看do while,发现和我们的输入有关的只有v39,也就是上面的那个运算的结果

图片描述

这里通过爆破得出了v17的范围

图片描述

只有7,这就好办了。爆破input前三个数就行。这里注意此处的input已经被之前的string_into_memory函数转化过了,爆破固定的范围即可。

得出一堆满足的数,随便选一个0AD填进去第一关就过了

图片描述

图片描述

这里相当于告诉你后面几位是多少了,不做赘述,加上后现在已知的flag是0ADKCTF

又是一个运算

图片描述

v19是v17+2,v17就是刚刚爆破出来结果全是7的那个,所以可以得知循环的次数固定是9次。此处进行运算的是我们输入的0ADKCTF的后九位。假设输入为0ADKCTF123456789时,这里的v41[v22]最开始指向的就是1

图片描述

当v24%v36不等于0时会失败。注意这里循环一次只需要取一次余,不用将前面的余全部取一遍。

比如输入123456789,先判断1%1==0,然后判断12%2==0,然后判断123%3==0,依次类推。

写了个脚本爆破,但是发现后面还有个限制,这里是从小到大排序我们刚刚输入的九个数

图片描述

然后这里是比较,必须1到9全部出现。所以刚刚的爆破还要加个限制。

图片描述

脚本如下

发现只能爆破出一个数381654729

这个函数不知道有啥用,我直接f8发现没事就没看了

图片描述

最后一关就是要满足这个v34等于这个数,查看v34交叉引用,发现是和很上面的sbox运算有关

图片描述

我们的前三位爆破出了很多数,我是随便选了一个就过的,看来这里是作为前三位的限制。

因为我们只有前三位不是唯一的,只需要爆破前三位就行。脚本如下

得到前三位是421,所以最终的序列号是421KCTF381654729

图片描述

题出的很有意思,像闯关游戏一样hhh

然后和第一名差了2秒,有点悲伤(

 
 
 
 
 
 
 
#include <cstring>
#include <iostream>
using namespace std;
int v3; // ebx
int len; // esi
char v5; // cl
int v6; // edi
char* v7; // esi
char v8; // ch
char v9; // cl
char v10; // dl
int v11; // ecx
int i; // edx
int v13; // ecx
int v14; // esi
int v15; // eax
int j; // edx
int v17; // edi
int v18; // esi
int v19; // edi
int v20; // esi
int v21; // eax
int v22; // ecx
int v23; // eax
int v24; // ecx
int v25; // eax
int v26; // edx
int v27; // ecx
char v28; // bl
char v29; // bh
int v30; // ecx
char* v31; // edi
int v33[200]; // [esp+10h] [ebp-368h]
int v34; // [esp+330h] [ebp-48h]
int v35; // [esp+334h] [ebp-44h]
int v36; // [esp+338h] [ebp-40h]
int v37; // [esp+33Ch] [ebp-3Ch]
int v38; // [esp+340h] [ebp-38h]
char v39; // [esp+347h] [ebp-31h]
char input[6]; // [esp+348h] [ebp-30h] BYREF
char v41[38]; // [esp+34Eh] [ebp-2Ah] BYREF
int main()
{
    for (int i = 0; i <= 0xff; i++)
    {
        v13 = i;
        v15 = v13;
        for (j = 1; j < 200; ++j)
        {
            if ((v15 & 1) != 0)                     // 奇数*3+1
                v15 = 3 * v15 + 1;
            else
                v15 >>= 1;                              // 偶数右移1
            v33[j] = v15;
        }
        v17 = v33[198] | v33[197] | v33[196];
        cout << v17 << endl;
    }
}
#include <cstring>
#include <iostream>
using namespace std;
int v3; // ebx
int len; // esi
char v5; // cl
int v6; // edi
char* v7; // esi
char v8; // ch
char v9; // cl
char v10; // dl
int v11; // ecx
int i; // edx
int v13; // ecx
int v14; // esi
int v15; // eax
int j; // edx
int v17; // edi
int v18; // esi
int v19; // edi
int v20; // esi
int v21; // eax
int v22; // ecx
int v23; // eax
int v24; // ecx
int v25; // eax
int v26; // edx
int v27; // ecx
char v28; // bl
char v29; // bh
int v30; // ecx
char* v31; // edi
int v33[200]; // [esp+10h] [ebp-368h]
int v34; // [esp+330h] [ebp-48h]
int v35; // [esp+334h] [ebp-44h]
int v36; // [esp+338h] [ebp-40h]
int v37; // [esp+33Ch] [ebp-3Ch]
int v38; // [esp+340h] [ebp-38h]
char v39; // [esp+347h] [ebp-31h]
char input[6]; // [esp+348h] [ebp-30h] BYREF
char v41[38]; // [esp+34Eh] [ebp-2Ah] BYREF
int main()
{
    for (int i = 0; i <= 0xff; i++)
    {
        v13 = i;
        v15 = v13;
        for (j = 1; j < 200; ++j)
        {
            if ((v15 & 1) != 0)                     // 奇数*3+1
                v15 = 3 * v15 + 1;
            else
                v15 >>= 1;                              // 偶数右移1
            v33[j] = v15;
        }
        v17 = v33[198] | v33[197] | v33[196];
        cout << v17 << endl;
    }
}
 
#include <cstring>
#include <iostream>
using namespace std;
int v3; // ebx
int len; // esi
char v5; // cl
int v6; // edi
char* v7; // esi
char v8; // ch
char v9; // cl
char v10; // dl
int v11; // ecx
int i; // edx
int v13; // ecx
int v14; // esi
int v15; // eax
int j; // edx
int v17; // edi
int v18; // esi
int v19; // edi
int v20; // esi
int v21; // eax
int v22; // ecx
int v23; // eax
int v24; // ecx
int v25; // eax
int v26; // edx
int v27; // ecx
char v28; // bl
char v29; // bh
int v30; // ecx
char* v31; // edi
int v33[200]; // [esp+10h] [ebp-368h]
int v34; // [esp+330h] [ebp-48h]
int v35; // [esp+334h] [ebp-44h]
int v36; // [esp+338h] [ebp-40h]
int v37; // [esp+33Ch] [ebp-3Ch]
int v38; // [esp+340h] [ebp-38h]
char v39; // [esp+347h] [ebp-31h]
char input[6]; // [esp+348h] [ebp-30h] BYREF
char v41[38]; // [esp+34Eh] [ebp-2Ah] BYREF
int main()
{
    for (int j = 0; j < 50; j++)
    {
        for (int z = 0; z < 50; z++)
        {
            for (int w = 0; w < 50; w++)
            {
                if ((j ^ z ^ w) == 7)
                {
                    if (j > 9)
                    {
                        cout << (char)(j + 55);
                    }
                    else
                    {
                        cout << (char)(j + 48);
                    }
                    if (z > 9)
                    {
                        cout << (char)(z + 55);
                    }
                    else
                    {
                        cout << (char)(z + 48);
                    }
                    if (w > 9)
                    {
                        cout << (char)(w + 55);
                    }
                    else
                    {
                        cout << (char)(w + 48);
                    }
                    cout << endl;
                }
            }
        }
    }
}
#include <cstring>
#include <iostream>
using namespace std;
int v3; // ebx
int len; // esi
char v5; // cl
int v6; // edi
char* v7; // esi
char v8; // ch
char v9; // cl
char v10; // dl
int v11; // ecx
int i; // edx
int v13; // ecx
int v14; // esi
int v15; // eax
int j; // edx
int v17; // edi
int v18; // esi
int v19; // edi
int v20; // esi
int v21; // eax
int v22; // ecx
int v23; // eax
int v24; // ecx
int v25; // eax
int v26; // edx
int v27; // ecx
char v28; // bl
char v29; // bh
int v30; // ecx
char* v31; // edi
int v33[200]; // [esp+10h] [ebp-368h]
int v34; // [esp+330h] [ebp-48h]
int v35; // [esp+334h] [ebp-44h]
int v36; // [esp+338h] [ebp-40h]
int v37; // [esp+33Ch] [ebp-3Ch]
int v38; // [esp+340h] [ebp-38h]
char v39; // [esp+347h] [ebp-31h]
char input[6]; // [esp+348h] [ebp-30h] BYREF
char v41[38]; // [esp+34Eh] [ebp-2Ah] BYREF
int main()
{
    for (int j = 0; j < 50; j++)
    {
        for (int z = 0; z < 50; z++)
        {
            for (int w = 0; w < 50; w++)
            {
                if ((j ^ z ^ w) == 7)
                {

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (2)
雪    币: 4120
活跃值: (5822)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
楼主0xad1f89a 从哪儿得到得?
2022-6-3 00:33
0
雪    币: 886
活跃值: (2310)
能力值: ( LV4,RANK:52 )
在线值:
发帖
回帖
粉丝
3
是那个0xF52E0765的取反的结果
2022-6-4 10:27
0
游客
登录 | 注册 方可回帖
返回
//