picoCTF GDB Test Drive:解密函数对应加密函数实现求助
正确实现「GDB Test Drive」的加密函数
直接给出符合逆向逻辑的加密函数,完全对应题目中解密函数的逆操作:
#include <stdio.h> #include <ctype.h> void encrypt(const char *flag, char *encrypted) { int idx = 0; while (flag[idx] != '\0') { unsigned char c = flag[idx]; if (islower(c)) { // 解密时是小写转大写,加密逆操作:小写转大写 encrypted[idx] = toupper(c); } else if (isupper(c)) { // 解密时是大写转小写,加密逆操作:大写转小写 encrypted[idx] = tolower(c); } else if (isdigit(c)) { // 数字反转是自逆操作,加密和解密逻辑一致 encrypted[idx] = '9' - (c - '0') + '0'; } else { // 异或0x13是自逆操作,加密和解密逻辑一致 encrypted[idx] = c ^ 0x13; } idx++; } encrypted[idx] = '\0'; } int main() { // 替换为题目中的正确原flag const char original_flag[] = "picoCTF{gDb_iS_sUp3r_u53fuL_05cd05bd}"; char encrypted_buf[128]; encrypt(original_flag, encrypted_buf); printf("Expected: A:4@r%uL5b3F88bC05C`Gb0fffe5fdgN\n", 0); printf("Actual: %s\n", encrypted_buf); return 0; }
逻辑说明(对应objdump反汇编的解密函数逻辑)
这个加密函数严格对应解密流程的逆操作:
- 小写字母:解密时执行
c -= 0x20转大写,加密执行相同操作转大写 - 大写字母:解密时执行
c += 0x20转小写,加密执行相同操作转小写 - 数字字符:解密时执行
c = 0x69 - c实现数字反转,由于该操作自逆(反转两次回到原数字),加密逻辑完全一致 - 其他字符:解密时执行
c ^= 0x13,异或操作自逆,加密时用相同逻辑
问题排查
- 字符缺失:大概率是循环终止条件错误(比如提前跳出而非判断
'\0'),或是未给加密字符串添加终止符'\0' - 字符错乱:可能是大小写分支逻辑写反、数字反转公式错误,或是异或数值不是
0x13
内容的提问来源于stack exchange,提问作者Nalan PandiKumar
相关产品推荐
相关产品推荐

