一.P1996 [WUSTCTF 2020]level1

用IDA打开main函数

第九行中出现了fread函数,这里我们给出fread函数的定义:

fread(ptr, size, n, stream);

四个参数的含义如下:

ptr:读到哪里

size:每个块多大

n:读几块

stream:从哪里读

第九行到第十行的意思就是打开了一个flag文件,并且把它存储到了ptr中

第十四行开始的if语句判断的是i和1按位与运算的结果是否1

这里补充一下按位与(&)运算的相关规则:

1.&运算本质上是只对二进制每一位单独运算,只有两个对应位都是1的时候才会返回1,只要有一个是0那么就会返回0。

2.奇数二进制的最后一位是1,偶数二进制的最后一位是0。

所以核心逻辑第10到18行其实等价于:

fread(flag, 1, 0x14, fp);

for (int i = 1; i <= 19; i++) {

    if (i % 2 == 1) {

        printf("%ld\n", flag[i] << i);

    } else {

        printf("%ld\n", flag[i] * i);

    }

}

解密脚本如下:

'''python

flag = []

for i, value in enumerate(values, start=1):

    if i & 1:

        flag.append(chr(value >> i))

    else:

        flag.append(chr(value // i))

print("".join(flag))

'''C++

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long a[20]={198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,
    1474560,800,6291456,1782,65536000};
    char flag[20];
    for(int i=1;i<=19;i++)
    {
        if(i%2==1)
        {
            flag[i]=a[i-1]>>i;
        }
        else
        {
            flag[i]=a[i-1]/i;
        }
    }
    for(int i=1;i<=19;i++)
    {
        cout<<flag[i];
    }
    return 0;
}

flag如下:

二.P2654 [SWPUCTF 2022 新生赛]base64

用IDA打开main函数:

从第五行我们可以看出,s1经过了某种方式编码方式得到的。

我们点击追踪sub_124C:

这是典型的base64编码。

(我们也可以查看字符串,倒数第二行就是base64编码的字符,也可以猜到这一点)

同样我们也可以在字符串列表中看到s2所对应的字符串:

因此这道题的核心逻辑就是比较s1和s2是否相等,如果相等那么就说明输入的flag正确,我们要做的就是通过base64解码来找到flag

下面是解密脚本:

'''python

import base64

s = "TlNTQ1RGe2Jhc2VfNjRfTlRXUTRaR0ROQzdOfQ=="

print(base64.b64decode(s).decode())

运行结果如下:

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐