simple-check-100
依旧是三个文件,跟secret-galaxy-300这道题同理,在合适的软件中打开其中之一即可。
按F5后先点进main函数中,感觉跟secret-galaxy-300这道题的main函数差不多,暂时先不管他。
先点开check_key这个函数看一眼。
v3+=那一行没看懂,搜了一下AI ,这一行的意思就是V3是一个数组前五项的和。
整个意思就是如果v3等于后面的那个数,就返回true。
我们再看看函数interesting_function(&v7)
本人看伪代码的能力不太行,使用AI 转化为等价的C语言代码
void decrypt_and_print(unsigned int *a1, const char *flag_data) {
for (int i = 0; i < 7; ++i) {
unsigned int v = a1[i] ^ 0xDEADBEEF;
for (int j = 0; j < 4; ++j) {
char byte = ((char *)&v)[j];
char key = flag_data[4 * i + j];
putchar(byte ^ key);
}
}
}
第一行的就是定义了一个指向没有符号的整数的指针和一个指向字符的指针(只能读,不能修改,常用于字符串常量。)
后面的是一个类似于加密的东西(没太看懂,呜呜呜~)(查了一下AI ,意思就是:倒序取 4 字节,逐字节与密钥异或,逐字节输出明文。)
#include <stdio.h>
int main(int argc, char* argv[]) {
unsigned char flag_data[] = {
220, 23, 191, 91, 212, 10, 210, 27, 125, 218,
167, 149, 181, 50, 16, 246, 28, 101, 83, 83,
103, 186, 234, 110, 120, 34, 114, 211};
char v7[] = {
84, -56, 126, -29, 100, -57, 22, -102, -51, 17,
101, 50, 45, -29, -45, 67, -110, -87, -99, -46,
-26, 109, 44, -45, -74, -67, -2, 106};
unsigned int v2;
unsigned char* v3;
// v11 = -478230444;
// v12 = -1709783196;
// v13 = 845484493;
// v14 = 1137959725;
// v15 = -761419374;
// v16 = -752063002;
// v17 = -74;
// v18 = -67;
// v19 = -2;
// v20 = 106;
// 方法一:类比写
for (int i = 0; i <= 6; ++i) {
v2 = ((v7[4 * i] & 0x000000FF) + ((v7[4 * i + 1] & 0x000000FF) << 8)
+ ((v7[4 * i + 2] & 0x000000FF) << 16) + ((v7[4 * i + 3] & 0x000000FF) <<
24)) ^ 0xDEADBEEF;
v3 = (unsigned char*)&v2;
for (int j = 3; j >= 0; --j) {
printf("%c", *(v3 + j) ^ flag_data[4 * i + j]);
}
}
// 方法二:按位异或,小端字节序,低位在低地址
// for (int i = 0; i <= 6; ++i) {
// printf("%c", v7[4 * i + 3] ^ 0xDE ^ flag_data[4 * i + 3]);
// printf("%c", v7[4 * i + 2] ^ 0xAD ^ flag_data[4 * i + 2]);
// printf("%c", v7[4 * i + 1] ^ 0xBE ^ flag_data[4 * i + 1]);
// printf("%c", v7[4 * i] ^ 0xEF ^ flag_data[4 * i]);
// }
return 0;
}
使用该脚本即可解出
(还剩一下东西,明天再研究,哥们要燃尽了)