交互式网站有哪些功能最火的推广软件
直接找到main函数入口,看代码
接收输入,并放入函数,返回1就是失败,返回0就是成功
理解这行代码是一个难点
转成自己看得懂的C语言,有几个难点需要理解
【难点1】
*(char *) 主要用于按字节访问内存数据或处理通用指针【难点2】
*(char *)(v3[i%3]+2*(i/3)) 能翻译成 v3[i%3][2*(i/3)]
v3 是一个字符串数组,数组元素为 const char * 类型,也就是指向字符串的指针。
v3[i%3] 会取出 v3 数组中索引为 i % 3 的元素,这是一个指向字符串的指针。
v3[i%3] + 2*(i/3) 表示在 v3[i%3] 指向的字符串基础上,向后偏移 2*(i/3) 个字符位置,得到一个新的指针。
(char *) 这里的类型转换其实是多余的,因为 v3[i%3] 本身就是 const char * 类型,不过加上也不影响。【注意点】
char str[] = "Hello";
printf("%c", *(char *)str+1); // 第一个字符的ascii码+1会打印b
printf("%c", *(char *)(str+1)); // 第一个字符的位置+1会打印e
那么整理后的代码就是如下
int main(void) {char str[] = "Hello"; // 输入的东西const char * v3 [] = {"Dufhbmf","pG`imos","ewUglpt"};for(int i=0; i<=11; ++i) {if (v3[i % 3][2 * (i / 3)] - *(char *) (i + str) != 1) {printf("错误密码");}}return 0;
}
分析代码
v3[i % 3][2 * (i / 3)] // 这里是程序固定的密文,不需要管
*(char *) (i + str) // 这里是输入每一个密码字符
明文 = (密文 - 输入密码 == 1)
明文 = 密文 - 1// 假设密文 = a,输入密码 = b,那么a-b==1,所以明文正确,那么b才是我们需要的明文
// 所以密文-1就得到明文for(int i=0; i<=11; ++i) {printf("%c", v3[i % 3][2 * (i / 3)]-1);
}>> Code_Talkers
时隔两年后,重新开始CTF,有了更深刻的理解