第一步 查壳。本题是有壳的题目,要把下载的attachment解压得到easyre.exe文件,再脱壳。
现在就ok了,是32位,拖入ida。
第二步 找main,按tab键,并分析。
简单分析一下
qmemcpy(v4, "*F'\"N,\"(I?+@", sizeof(v4));
- 这行代码使用了qmemcpy
函数,将"*F'\"N,\"(I?+@"
复制到v4
中。printf("Please input:");
- 这会在屏幕上输出 "Please input:"。scanf("%s", v6);
- 这行代码等待用户输入,并将输入存储到v6
中。if ( v6[0] != 'A' || v6[1] != 'C' || v6[2] != 'T' || v6[3] != 'F' || v6[4] != '{' || v10 != '}' ) return 0;
- 这是一个条件语句,如果v6
的前五个字符不是 "ACTF{" 并且最后一个字符不是 "}",则返回0。- 接下来的代码将
v7
、v8
和v9
分别赋给v5
数组的前三个元素。 - 然后使用一个循环检查
v4
数组与另一个数据数组的内容是否匹配,如果不匹配则返回0。 - 最后,如果以上条件都满足,则输出 "You are correct!"。
分析一下循环
1、for ( i = 0; i <= 11; ++i )
- 这是一个循环语句,它从0开始迭代到11(包括11),每次迭代增加1。
2、*((char *)v5 + i)
- 这是一个指针操作,将v5
的地址加上i
的偏移量,然后将其转换为char
类型的指针。这样做是为了访问v5
数组中的特定元素。由此得出v5原本是int数组,v5指针把v5转换成了char数组。本题主要与v4有关
这就是v4数组(如图)
V4数组进制转换一下[42,70,39,34,78,44,34,40,73,63,43,64]
Code密文:}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=
<;:9876543210/.-,+*)(',27h,'&%$# !"
注:写脚本时的密文格式 定义名称=‘~密文 ’
第三步 编写脚本
分析脚本
v4=[42,70,39,34,78,44,34,40,73,63,43,64]
- 这行代码定义了一个整数数组v4
,其中包含了一系列整数。flag=''
- 这行代码定义了一个空字符串变量flag
,用于存储转换后的字符。x=[]
- 这行代码定义了一个空列表变量x
,用于存储转换后的整数。for i in v4:
- 这是一个循环语句,它遍历v4
数组中的每个元素,并将当前元素赋值给变量i
。x.append(code.find(chr(i))+1)
- 这行代码将通过以下步骤将整数转换为字符的索引值:
a. chr(i)
- 这将整数i
转换为对应的字符。
b. code.find(chr(i))
- 这将在字符串code
中查找字符chr(i)
的索引位置。
c. code.find(chr(i))+1
- 由于索引从0开始,这里将索引值加1,以便与字符的位置对应。
d. x.append(code.find(chr(i))+1)
- 将转换后的整数添加到列表x
中。
6、for i in x:
- 这是另一个循环语句,它遍历列表x
中的每个元素,并将当前元素赋值给变量i
。
7、flag+=chr(i)
- 这行代码将通过以下步骤将整数转换为字符:
a. chr(i)
- 这将整数i
转换为对应的字符。
b. flag+=chr(i)
- 将转换后的字符追加到字符串flag
的末尾。
8、print(flag)
- 这行代码将打印最终转换后的字符串flag
。
得到flag
flag{U9X_1S_W6@T?}