首先简单的查壳操作就不说了,丢进去就行了,一看是64bit,那就用ida64打开打开后看到有很多的函数,第一反应ctrl+f寻找main函数,但我更想shift+f12直接找字符串,然后就发现了这些这边关键词congras,代表成功的意思,那就点进去看一下接着选中这句字符串,ctrl+x进入,然后是这样的一看就很有东西,那就逐一分析喽,并在旁边写上注释,总的分析不难,有一些细节点注意一下就好了,关键在于if(v21!=(v24^v20)),这边两个已知,v21和v24,那么未知的v20就是flag了呗,往上找代码对v21和v24的处理就行了,这里的v10有着0-21的可能,因为是对22取模,v21有数组对他赋值,进入提取出来就行了,v10对v19进行了赋值,v23在用之前会被归0,然后进入while,对v24操作,得到v24,这边v18没用,是烟雾弹,大概就这样分析,最后上代码
#include<stdio.h>
int main() {
int v21[]= {
95, 242, 94, 139, 78, 14, 163, 170, 199, 147,
129, 61, 95, 116, 163, 9, 145, 43, 73, 40,
147, 103, 0, 0
}; //这个数组是提取出来的
int result;
int v24;
int v23;
int v19;
int v10[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14
,15,16,17,18,19,20,21 }; //这个数组是v10的所有取值
for (int i = 0; i < sizeof(v21) / sizeof(int); i++) {
v24 = 0;
v23 = 0;
v19 = v10[i] + 1;
while (v23 < v19) { //照葫芦画瓢就行
++v23;
v24= 1828812941 * v24 + 12345;
}
result = v21[i] ^ v24;
printf("%c", result);
}
return 0;
}
最后运行一下就得出flag喽。
总结一下啊,这边可能有一个点会想不到,就是v10的取值,因为是对22取模,所以可能值为0-21,然后就是分析代码的能力了,还是很简单的,熟能生巧,大家多做做就会了。(给个赞支持一下喽,^_^)