emeinet亿玫网站建设,我的家乡网页制作代码,专业房产网站建设公司,比较好的网站建设技术开发第一步 查壳。该题为64位。 第二步 进入主函数#xff0c;跟进dword_40F040,它应该与关键字符串有关 分析一下#xff1a;
初始化和输入
sub_402230(argc, argv, envp); 这行可能是一个初始化函数#xff0c;用于设置程序环境或处理命令行参数。具体功能不明#xff0c…第一步 查壳。该题为64位。 第二步 进入主函数跟进dword_40F040,它应该与关键字符串有关 分析一下
初始化和输入
sub_402230(argc, argv, envp); 这行可能是一个初始化函数用于设置程序环境或处理命令行参数。具体功能不明因为这取决于函数的实现。sub_40E640(Give me your code:\n); 输出提示信息给用户要求输入代码。sub_40E5F0(%s, Str); 通过格式化字符串读取用户输入并存储在变量 Str 中。
验证输入长度
if (strlen(Str) ! 33) 检查输入字符串的长度是否为33个字符。如果不是执行以下操作 sub_40E640(Wrong!\n); 输出错误信息。system(pause); 暂停程序执行等待用户按键。exit(0); 退出程序。所以告诉我们字符串长度必须是33才能进行下面的操作。
数据处理
循环处理字符串 for (i 0; i 32; i) 对输入字符串的每个字符进行处理循环33次从0到32。byte_414040[i] Str[dword_40F040[i]]; dword_40F040[i] 可能是一个包含索引的数组用于从 Str 中选择字符。将选定的字符赋值给 byte_414040 数组的相应位置。byte_414040[i] ^ LOBYTE(dword_40F040[i]); 对字符进行异或操作LOBYTE 取 dword_40F040[i] 的低字节部分。
验证处理结果
for (j 0; j 32; j) 再次遍历处理后的数据检查是否与某个预设的数组 byte_40F0E0 匹配。if (byte_40F0E0[j] ! byte_414040[j]) 如果不匹配输出错误信息暂停程序并退出。
输出成功信息
成功验证后的输出 sub_40E640(Right!Good Job!\n); 输出成功信息。sub_40E640(Here is your flag: %s\n, Str); 输出用户原始输入作为“flag”。system(pause); 暂停程序等待用户操作。
程序结束
return 0. 程序正常结束。
第三步 跟进后发现这两组数据按shiiftE提取 选中其中任意一个数据按H键转换成以下数据 这后面那个dup0可以不用管。
第四步 编写脚本 分析一下脚本:
初始化数组
dword_40F040 和 byte_40F0E0 数组 这两个数组包含了一些十进制和十六进制的数值看起来像是加密或混淆数据的关键部分。str 数组和 flag 字符串 str 初始化为长度为33的全零数组用于存储中间结果。flag 初始化为空字符串用于存储最终的解密字符串。
数据处理
第一个循环异或操作和重构 str 数组 for i in range(33): 遍历 byte_40F0E0 数组。byte_40F0E0[i] ^ dword_40F040[i] 对 byte_40F0E0 和 dword_40F040 数组中相同位置的元素进行异或操作结果仍存储在 byte_40F0E0 中。异或操作是一种常见的加密和解密技术因为它是可逆的。str[dword_40F040[i]] byte_40F0E0[i] 使用 dword_40F040 数组的值作为索引将异或后的 byte_40F0E0 数组的值重新排序或重构到 str 数组中。这一步可能是将数据重新排列到正确的顺序以便解码或显示。
输出结果
第二个循环构建 flag 字符串 for i in range(33): 遍历 str 数组。flag chr(str[i]) 将 str 数组中的每个整数转换为对应的ASCII字符并追加到 flag 字符串。这一步将整数数组转换为可读的字符串。
flag{Tr4nsp0sltiON_Clph3r_1s_3z}