攻防世界RE挑战:逆向解析字符操作

需积分: 14 1 下载量 153 浏览量 更新于2024-08-05 收藏 3KB MD 举报
在"攻防世界RE 流浪者 wp"这篇文章中,主要探讨的是一个关于逆向工程和密码学挑战的问题。题目涉及到了两个关键的函数:sub_401890 和 sub_4017f0。首先,让我们详细了解这两个函数的功能和解题过程。 **sub_401890函数**: 这个函数的主要任务是接收一个包含字符的输入数组,然后对每个元素进行特定的转换。具体来说,它会检查元素是否是数字、小写或大写字母。如果是数字,它会进行-48的操作;如果是小写字母,-87;如果是大写字母,则-29。这些操作相当于将字符的ASCII码减去相应的偏移量。经过这些处理后,新的数组(字符串)会被传递给sub_4017f0函数进行进一步处理。 **sub_4017f0函数**: 此函数的核心是一个预设的数组Str1,包含了字符串"abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ"。函数通过while循环遍历输入的字符串a1,将a1中的每个元素值作为数组Str1的索引,取出对应的字符并存储回Str1。循环结束后,将处理后的Str1与给定的目标字符串"KanXueCTF2019JustForhappy"进行比较,如果匹配则认为解密成功。 **解题思路**: 解题的关键在于逆向工程,即根据给出的函数逻辑来恢复原始输入字符串。解题步骤如下: 1. **找到匹配元素的下标**: 首先,比较目标字符串"KanXueCTF2019JustForhappy"和预设数组Str1,找出两者相同的字符位置。通过Python代码,可以得到每个匹配字符的下标,如[19, 0, 27, 59, ...]。 2. **根据判断条件还原输入值**: 根据sub_401890函数的转换规则,将这些下标值转换回原始字符。根据ASCII码规则,数字0-9对应的ASCII值范围是48-57,小写字母'a'-'z'是97-122,大写字母'A'-'Z'是65-90。所以,对于每个下标,如果在0-9范围内,加48;在10-35范围内,加87;在36-90范围内,加29。最终将这些值转换为字符,拼接成原始输入字符串。 **C语言解密脚本**: 虽然未提供完整的C语言解密脚本,但可以推测其大致结构如下: ```c char* decrypt_input(char* encrypted_input) { int* index_array = ...; // 从步骤1得到的下标数组 char decrypted_str[...]; // 存储还原后的字符串 for (int i = 0; i < sizeof(index_array)/sizeof(int); i++) { int offset; if (index_array[i] >= 0 && index_array[i] <= 9) { offset = index_array[i] + 48; } else if (index_array[i] >= 10 && index_array[i] <= 35) { offset = index_array[i] + 87; } else { offset = index_array[i] + 29; } decrypted_str[i] = (char)(offset); // 将ASCII值转换为字符 } decrypted_str[...]; // 可能还需要填充剩余部分或处理边界情况 return decrypted_str; } ``` 总结来说,这篇文章的核心知识点是逆向工程中的字符加密和解密技巧,涉及到ASCII码的转换和字符串匹配。解题的关键在于理解函数的逻辑,通过逆推找到正确的字符映射关系,从而还原出原始输入字符串。