首先,最基本的,先查壳,发现是64bit的,那就拖进ida64中用ida64打开后是这样的直接进入main函数,然后就简单的分析一下,写点注释,抓个重点,if判断的语句,若条件满足就incorrect,不满足就输出nice,那么括号内的条件就不能满足了,然后进入这个函数看看发现是一个简单的算法,注意,这个函数的返回值必须为0才行,然后分析代码喽,发现这边定义字符数组的方式有点奇怪,与我们通常在c语言中定义的不太一样,那这边我们就要大胆猜测喽,这,这其实可以约等于一个二维数组,但那不好想,索性直接看成三个字符数组,这三个数组地址连续,然后往下看v3代表的是地址,*(v3[i%3]+2*(i/3)),这句话,很关键!首先我们看到外面的那个*,这个代表取用该对象所指的数,而且该对象必须是指针,那这说明什么?整个圆括号内的东西,都是在代表一个指针所指的位置,拆开来看,i%3,结果有0,1,2,就代表前面重拆成的三个字符数组,再看后面,2*(i/3),代表某数组的具体字符位置,最后半句话,*(i+a1),注意这边也有*哦,所以此处也是取个数,而不是对数进行操作,这边举个例子吧,假设i=0,i%3=0,那就取数组v0(将这三个数组重新命名,分别为v0,v1,v2),然后2*(i/3)=0,就取该数组的第0位,也就是D,以此类推,最后上代码
#include<stdio.h>
int main() {
char str1[] = "Dufhbmf";
char str2[] = "pG`imos"; //拆成三个数组,str1,str2,str3
char str3[] = "ewUglpt";
char result;
for (int i = 0; i <= 11; i++) {
if (i % 3 == 0) {
result = str1[2 * (i / 3)] - 1;
}
else if (i % 3 == 1) {
result = str2[2 * (i / 3)] - 1;
}
else {
result = str3[2 * (i / 3)] - 1;
}
printf("%c", result);
}
return 0;
}
就运行出flag了,最后总结一下,看到*一定要敏感,这是对指针操作的符号,不是对数操作,做到最后发现,也就是一个简单的小算法,但其实往往会错在没有看到或者理解*,下次优先注意,还愣着干嘛,拿出小本本记上啊!