ctfshow七夕杯2022(re)

逆向签到

ctfshow七夕杯2022(re)_第1张图片

easy_magic

直接看主函数就行了

scanf()函数但是注意这里只要输入一个字符(%c)就可以了
ctfshow七夕杯2022(re)_第2张图片

这里需要注意v5的值等于我们输入的字符(v4)去异或0x77
而v10数组的第一个字符就等于我们输入的v4
ctfshow七夕杯2022(re)_第3张图片
主算法
ctfshow七夕杯2022(re)_第4张图片
主算法很简单就两句话 :
v5依次加上v7的值然后将每次相加结果给了v10数组
最后把v10数组md5加密然后赋值给了s1
最后比较s1和s2的md5值是否相同 如果相同说明输入的字符正确

解题思路:
虽然出题人给了md5值但是明显直接去解md5不是出题人的本意
但我们需要求出v10的值
因为算法逻辑很清楚就是单纯让v5去累加v7而且每次累加的结果赋值给v10
所以我们只需要知道v5的初始值是啥就可以了
因为比赛的flag格式为ctfshow{}所以可以猜测v5的初始值一定是c的asc码(99)

直接把算法抠出来解密就行了

#include 
#include
int main()
{
    int  v4;
    char v5;
    char v7[32];
    char v10[104];
    v7[0] = 17;
    v7[1] = 0xF2;
    v7[2] = 13;
    v7[3] = 0xF5;
    v7[4] = 7;
    v7[5] = 8;
    v7[6] = 4;
    v7[7] = 0xBC;
    v7[8] = 65;
    v7[9] = 0xE7;
    v7[10] = 7;
    v7[11] = 6;
    v7[12] = 0xF5;
    v7[13] = 6;
    v7[14] = 0xF8;
    v7[15] = 10;
    v7[16] = 10;
    v7[17] = 0xEC;
    v7[18] = 9;
    v7[19] = 0xFD;
    v7[20] = 0xD;
    v7[21] = 0xF3;
    v7[22] = 24;
    v5 = 0;
    v4 = int('c') ^ 0x77;
    v5 = v4 ^ 0x77;
    v10[0] = 'c';
    for (int i = 0; i <= 22; ++i)
    {
        v5 += v7[i];
        v10[i + 1] = v5;
    }

    v10[24] = 0;

    for(int i = 0;i<=strlen(v10);i++)
    {
    printf("%c", v10[i]);
    }
}
//ctfshow{7x_flag_is_here}

这题是学弟给的思路 贴上学弟的python的脚本

v7 = [17,-14,13,-11,7,8,4,-68,65,-25,7,6,-11,6,-8,10,10,-20,9,-3,13,-13,24]
v4 = "c"
for i in range(len(v7)):

v5 = v4
v10 = ""
for i in range(len(v4)):
v10 += chr(ord(v5[i])+v7[i])

v4 = "c" + v10
print(v4)

你可能感兴趣的:(c语言)