BUUCTF Reverse/[ACTF新生赛2020]SoulLike
看下文件信息,没有加壳
IDA64位打开,还是字符串比较题目
__int64 __fastcall main(int a1, char **a2, char **a3)
{
__int64 result; // rax
char v5; // [rsp+7h] [rbp-B9h]
int i; // [rsp+8h] [rbp-B8h]
int j; // [rsp+Ch] [rbp-B4h]
int v8[14]; // [rsp+10h] [rbp-B0h] BYREF
char v9[110]; // [rsp+4Ah] [rbp-76h] BYREF
unsigned __int64 v10; // [rsp+B8h] [rbp-8h]
v10 = __readfsqword(0x28u);
printf("input flag:");
scanf("%s", &v9[6]);
strcpy(v9, "actf{");
v5 = 1;
for ( i = 0; i <= 4; ++i )
{
if ( v9[i] != v9[i + 6] )
{
v5 = 0;
goto LABEL_6;
}
}
if ( !v5 )
goto LABEL_16;
LABEL_6:
for ( j = 0; j <= 11; ++j )
v8[j] = v9[j + 11];
if ( (unsigned __int8)sub_83A(v8) && v9[23] == 125 )
{
printf("That's true! flag is %s", &v9[6]);
result = 0LL;
}
else
{
LABEL_16:
printf("Try another time...");
result = 0LL;
}
return result;
}
逻辑很简单,是以 actf{} 包裹的flag,且括号里面的字符为12位
这里就是输出flag的条件了
if ( (unsigned __int8)sub_83A(v8) && v9[23] == 125 )
{
printf("That's true! flag is %s", &v9[6]);
result = 0LL;
}
sub_83A(v8)
对括号里面的12位字符进行变换,但在跟进的时候出了个小问题,说啥太大了
百度了一下,可以修改配置文件IDA 7.0\cfg\hexrays.cfg来解决
可编译的最大函数大小为64k,然后改成1024(这个随意,,不过不知道具体要改大多少,这函数确实挺大的,,一整个蓝条都是)
修改后就能正常反编译了,,,函数是在是太太太长了,完整的就不贴了,贴个开头和结尾意思意思。
结尾这里,变换后的字符串要等于v3,不然输出wrong
显而易见只能爆破了,太长了,只贴主要的
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int v[]={126,50,37,88,89,107,53,110,0,19,30,56};
int f(char *a1,int i)
{
*a1 ^= 0x2Bu;
a1[1] ^= 0x6Cu;
a1[2] ^= 0x7Eu;
a1[3] ^= 0x56u;
...
...
...
a1[9] ^= 0x70u;
a1[10] ^= 0x29u;
a1[11] ^= 0x3Bu;
if(a1[i] == v[i])
return 1;
else
return 0;
}
int main()
{
int i,j,k;
char flag[13] = "";
char temp[13] = "";
for(i = 0; i < 12 ; i++)
{
for(k = 33; k <= 126 ; k++)
{
strcpy(flag,temp);
flag[i] = k;
if(f(flag,i))
{
temp[i] = k;
break;
}
}
}
printf("flag{%s}\n",temp);
return 0;
}
运行结果
flag{b0Nf|Re_LiT!}