前言:学习笔记。
常规:下载 解压 查壳。
64>>> 64 IDA Pro打开。
常规:先找字符串再找main。
程序分析:
① 输入的字符串长度必须为33。
② 循环33次, str【打乱的顺序】赋值给byte_41040【i】
③ byte_41040【i】再进行异或操作。
C脚本:
编写思路:
逆向回去。
用已知的密文,倒着走一遍。
#include <stdio.h>
#include <string.h>
int main()
{
int dword_40F040[40] ={9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14,0};
int byte_40F0E0[34] =
{
103, 121, 123, 127, 117, 43, 60, 82, 83, 121,
87, 94, 93, 66, 123, 45, 42, 102, 66, 126,
76, 87, 121, 65, 107, 126, 101, 60, 92, 69,
111, 98, 77,0
};
int str[33] = { 0 };
for (int i = 0; i<=32 ; i++)
{
byte_40F0E0[i] ^= (dword_40F040[i] & 0xFF);//异或。
str[dword_40F040[i]] = byte_40F0E0[i];//顺序打乱。
printf("%c", str[dword_40F040[i]]);//顺序打乱的flag。
}
printf("\n\n");
for (int j = 0; j <= 32; j++)//flag复位操作。
{
printf("%c", str[j]);
}
return 0;
}
运行结果:
验证:
flag{Tr4nsp0sltiON_Clph3r_1s_3z}。
总结:比较简单,单纯考查异或算法以及字符打乱进行还原。