Newbie_calculations
我们打开这个文件,会发现输入的东西什么也不会显示出来,这点需要我们留下心。
然后我们常规操作(ida打开)我们是可以先用PE看看信息的。看到main函数是有点长的,我们就看最后的判断:
此时我们就去看看sub_401C7F(其实它是可以猜出来的,就是一个输出,我们也就不去看了)
而上面我们可以看到有很多函数,这点是有点工作量(其实就几个函数,我们都给它分析一下就行了)
先来看看sub_401000这个函数,它其实就是讲两个数相加,a1=a1+a2,既然知道了第一个函数的作用,那我们就来看看第二个函数的作用:
那这个函数我们就应该知道它是个什么函数了,它有什么作用呢?循环了a2次,有a2个a1个相加,那就是a1*a2了呗。
那来来看看看sub_401220这个函数吧:
这个其实就是减法了!
这样的话,就是再主函数里的那些代码我们就可以看懂了,然后我们就可以去编写一个脚本了,不过编写的话是有点麻烦的。
s = [100, 97, 102, 56, 102, 52, 100, 56, 49, 54, 50, 54, 49, 97, 52, 49, 97, 49, 49, 53, 48, 53, 50, 97, 49, 98, 99, 50, 49, 97, 100, 101]
a = ''
for i in s:
a += chr(i)
print(a)
这个s是手动计算上面的值,不建议这样(实在没办法也可以)
而我们是可以直接复制粘贴到C里面,改几个东西就行了:
#include <stdio.h>
#include<iostream>
#include<iomanip>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<map>
#include<time.h>
#include<queue>
#include <Windows.h>
#include "windows.h"
using namespace std;
int mul(int a,int b)
{
return a*b;
}
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int main()
{
int v3; // eax
int v4; // ST1C_4
int v5; // ST20_4
int v6; // ST20_4
signed int i; // [esp+4h] [ebp-90h]
signed int j; // [esp+8h] [ebp-8Ch]
int v10[32]; // [esp+Ch] [ebp-88h]
int v11; // [esp+8Ch] [ebp-8h]
for ( i = 0; i < 32; ++i )
v10[i] = 1;
v11 = 0;
puts("Your flag is:");
v3 = mul(v10[0], 1000000000);
v3 = sub(v3, 999999950);
v10[0]=mul(v3, 2);
v3 = add(v10[1], 5000000);
v3 = sub(v3, 6666666);
v3 = add(v3, 1666666);
v3 = add(v3, 45);
v3 = mul(v3, 2);
v10[1]=add(v3, 5);
v3 = mul(v10[2], 1000000000);
v3 = sub(v3, 999999950);
v3 = mul(v3, 2);
v10[2]=add(v3, 2);
v3 = add(v10[3], 55);
v3 = sub(v3, 3);
v3 = add(v3, 4);
v10[3]=sub(v3, 1);
v3 = mul(v10[4], 100000000);
v3 = sub(v3, 99999950);
v3 = mul(v3, 2);
v10[4]=add(v3, 2);
v3 = sub(v10[5], 1);
v3 = mul(v3, 1000000000);
v3 = add(v3, 55);
v10[5]=sub(v3, 3);
v3 = mul(v10[6], 1000000);
v3 = sub(v3, 999975);
v10[6]=mul(v3, 4);
v3 = add(v10[7], 55);
v3 = sub(v3, 33);
v3 = add(v3, 44);
v10[7]=sub(v3, 11);
v3 = mul(v10[8], 10);
v3 = sub(v3, 5);
v3 = mul(v3, 8);
v10[8]=add(v3, 9);
v3 = add(v10[9], 0);
v3 = sub(v3, 0);
v3 = add(v3, 11);
v3 = sub(v3, 11);
v10[9]=add(v3, 53);
v3 = add(v10[10], 49);
v3 = sub(v3, 2);
v3 = add(v3, 4);
v10[10]=sub(v3, 2);
v3 = mul(v10[11], 1000000);
v3 = sub(v3, 999999);
v3 = mul(v3, 4);
v10[11]=add(v3, 50);
v3 = add(v10[12], 1);
v3 = add(v3, 1);
v3 = add(v3, 1);
v3 = add(v3, 1);
v3 = add(v3, 1);
v3 = add(v3, 1);
v3 = add(v3, 10);
v10[12]=add(v3, 32);
v3 = mul(v10[13], 10);
v3 = sub(v3, 5);
v3 = mul(v3, 8);
v3 = add(v3, 9);
v10[13]=add(v3, 48);
v3 = sub(v10[14], 1);
v3 = mul(v3, -294967296);
v3 = add(v3, 55);
v10[14]=sub(v3, 3);
v3 = add(v10[15], 1);
v3 = add(v3, 2);
v3 = add(v3, 3);
v3 = add(v3, 4);
v3 = add(v3, 5);
v3 = add(v3, 6);
v3 = add(v3, 7);
v10[15]=add(v3, 20);
v3 = mul(v10[16], 10);
v3 = sub(v3, 5);
v3 = mul(v3, 8);
v3 = add(v3, 9);
v10[16]=add(v3, 48);
v3 = add(v10[17], 7);
v3 = add(v3, 6);
v3 = add(v3, 5);
v3 = add(v3, 4);
v3 = add(v3, 3);
v3 = add(v3, 2);
v3 = add(v3, 1);
v10[17]=add(v3, 20);
v3 = add(v10[18], 7);
v3 = add(v3, 2);
v3 = add(v3, 4);
v3 = add(v3, 3);
v3 = add(v3, 6);
v3 = add(v3, 5);
v3 = add(v3, 1);
v10[18]=add(v3, 20);
v3 = mul(v10[19], 1000000);
v3 = sub(v3, 999999);
v3 = mul(v3, 4);
v3 = add(v3, 50);
v10[19]=sub(v3, 1);
v3 = sub(v10[20], 1);
v3 = mul(v3, -294967296);
v3 = add(v3, 49);
v10[20]=sub(v3, 1);
v3 = sub(v10[21], 1);
v3 = mul(v3, 1000000000);
v3 = add(v3, 54);
v3 = sub(v3, 1);
v3 = add(v3, 1000000000);
v10[21]=sub(v3, 1000000000);
v3 = add(v10[22], 49);
v3 = sub(v3, 1);
v3 = add(v3, 2);
v10[22]=sub(v3, 1);
v3 = mul(v10[23], 10);
v3 = sub(v3, 5);
v3 = mul(v3, 8);
v3 = add(v3, 9);
v10[23]=add(v3, 48);
v3 = add(v10[24], 1);
v3 = add(v3, 3);
v3 = add(v3, 3);
v3 = add(v3, 3);
v3 = add(v3, 6);
v3 = add(v3, 6);
v3 = add(v3, 6);
v10[24]=add(v3, 20);
v3 = add(v10[25], 55);
v3 = sub(v3, 33);
v3 = add(v3, 44);
v3 = sub(v3, 11);
v10[25]=add(v3, 42);
v10[26]=add(v10[26], v10[25]);
v10[27]=add(v10[27], v10[12]);
v4 = v10[27];
v3 = sub(v10[28], 1);
v3 = add(v3, v4);
v10[28]=sub(v3, 1);
v5 = v10[23];
v3 = sub(v10[29], 1);
v3 = mul(v3, 1000000);
v10[29]=add(v3, v5);
v6 = v10[27];
v3 = add(v10[30], 1);
v10[30]=mul(v3, v6);
v10[31]=add(v10[31], v10[30]);
printf("CTF{");
for ( j = 0; j < 32; ++j )
printf("%c", (v10[j]));
printf("}\n");
return 0;
}
挺麻烦的,不过坚持下来时能够成功的。
望诸君共勉!
望一键三连!!!