关于线程创建和等待线程的题目
首先UPX脱壳
然后发现两个线程共同等待一个线程 谁先得到谁就释放 释放了另一个线程就可以继续运行
就是控制两个线程轮流执行
第一个线程有对Source处理 第二个函数没有 由于创建线程先后顺序 第一个线程先执行
也就是说Source对奇数位被处理 偶数位不变
处理函数也很简单 分大小写 而且table也是大小写分开储存的 方便直接判断
细心一点发现 最后的对比函数循环了30次 而对比的字符串只有29位 所以最终的flag在 末尾 }前 随便加一位就行了

table = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmx00' s = 'TOiZiZtOrYaToUwPnToBsOaOapsyS' flag = 'flag{' for i in range(len(s)): if i % 2: for j in range(len(table)): if table[j] == s[i]: if(j < 26): flag += chr(96 + j) else: flag += chr(38 + j) break else: flag += s[i] flag += 'E}' print flag