may be是一种代码保护手段,用IDA打开文件发现main函数竟然是爆红的,于是刚开始做的时候认为是存在花指令的,但认真看了一下好像不算是花。。。。。
解决方法 ---> 所以爆红地址选中按p就好了
然后table看伪代码
简单易懂的代码 比较v8与v9地址存的值及之后固定长度地址存的值(就是v8与v9v10v11v12v13首尾相接的比较),相同就会输出Con。所以我们将v9 -- v13首尾相接(注意端序转换)然后进行逆运算即可。
代码中发现加密函数func_40117E跟进阅读
发现5 个函数,所以本题逻辑比较好理解了。
flag长度为29,每5个字符进行分组采取5种加密方式,循环至结束(附草草草图
于是据此写下脚本
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<cstring>
#include<list>
#include<stdlib.h>
using namespace std;
unsigned char func1(unsigned char a1)
{
return a1 ^ 0x19;
}
unsigned char func2(unsigned char a1)
{
return a1 - 18;
}
unsigned char func3(unsigned char a1)
{
return a1 + 16;
}
unsigned char func4(unsigned char a1)
{
char a;
for (char i = 32 ; i < 127 ; i++)
{
if ( (2 * (a1 & 0x7F)) == i)
a = i;
return i;
}
//return 2 * (a1 & 0x7F);
}
unsigned char func5(unsigned char a1)
{
unsigned char a;
for (int i = 32 ; i < 127 ; i++)
{
if (i == (a1 ^ (a1 ^ ~a1) & 0x80))
a = i;
}
return a;
//return a1 ^ (a1 ^ ~a1) & 0x80;
}
int main ()
{
unsigned char flag[32]={0};
unsigned char (*funcs[5])(unsigned char)={func1,func2,func3,func4,func5};
unsigned char Arglist[]={0x7F, 0x7E, 0x51, 0xCE, 0xFB, 0x4E, 0x7A, 0x24, 0xE8, 0xDF,
0x59, 0x71, 0x26, 0xCA, 0xE1, 0x6C, 0x86, 0x21, 0xCC, 0xF5,
0x28, 0x71, 0x14, 0xD8, 0xEF, 0x6E, 0x77, 0x62, 0xFA};
for(int i=0;i<29;i++){
flag[i] = funcs[i % 5](Arglist[i]);
printf("%c",flag[i]);
}
}
脚本的func4存在错误,部分字符输出有问题,因为我太菜了
// flag{Wh4t_@_6eaut1fu1_$1ower} //好像是不太记得了