羊城杯
- easyre
- login
easyre
打开一看非常明了,输入的字符串经过三次加密后和Str2比较
用Str2往回逆即可

倒着逆
第三次加密:好像是后移三位的凯撒但又不完全是。。唉不会就爆破
第二次加密:13位位一组调换了前后顺序,换回去即可
第一次加密:最后解一个base64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include<iostream> using namespace std;
int main() { char temp[] = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"; char flag[100] = ""; char* v8 = temp; char v5; char* v7 = flag; for (int i = 0; i < strlen(temp); i++) { for (int a = 0x20; a < 0x7b; a++) { v5 = a; if (v5 <= 64 || v5 > 90) { if (v5 <= 96 || v5 > 122) { if (v5 <= 47 || v5 > 57) *v7 = v5; else *v7 = (v5 - 48 + 3) % 10 + 48; } else { *v7 = (v5 - 97 + 3) % 26 + 97; } } else { *v7 = (v5 - 65 + 3) % 26 + 65; } if (*v7 == *v8) { v7++; v8++; printf("%c", v5); } } } char a1[100] = "BjYjM2Mjk4NzMR1dIVHs2NzJjY0MTEzM2VhMn0=zQ3NzhhMzhlOD"; char a3[100] = ""; char* Source; char* v6; Source = a1; v6 = a3; strncpy(a3, a1 + 13, 13); strncpy(v6 + 13, Source + 39, 13); strncpy(v6 + 26, Source , 13); strncpy(v6 + 39, Source + 26, 13); cout << endl << a3; }
|
login
拿到的是用pyinstaller压缩成exe的py文件
第一步需要两个py工具:
pyinstxtractor 和 uncompyle6
(第一个工具可以在github上下载)
把 login.exe和pyinstxtractor.py 放在同一目录下

然后在解压结果的文件夹里找到login.pyc
但直接反编译报错了,原来在用pyinstaller压缩时会丢失一部分文件头,要对着struct.pyc改一下(绝了。。。


改完后就可以正常用uncompyle反编译成py文件了
一轮加密:每个数跟后一个数异或


要根据所给方程算出a1到a14
这时候就要 z3,yyds!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| from z3 import *
a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 = Ints("a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14") s = Solver() s.add(a1 * 88 + a2 * 67 + a3 * 65 - a4 * 5 + a5 * 43 + a6 * 89 + a7 * 25 + a8 * 13 - a9 * 36 + a10 * 15 + a11 * 11 + a12 * 47 - a13 * 60 + a14 * 29 == 22748) s.add(a1 * 89 + a2 * 7 + a3 * 12 - a4 * 25 + a5 * 41 + a6 * 23 + a7 * 20 - a8 * 66 + a9 * 31 + a10 * 8 + a11 * 2 - a12 * 41 - a13 * 39 + a14 * 17 == 7258) s.add(a1 * 28 + a2 * 35 + a3 * 16 - a4 * 65 + a5 * 53 + a6 * 39 + a7 * 27 + a8 * 15 - a9 * 33 + a10 * 13 + a11 * 101 + a12 * 90 - a13 * 34 + a14 * 23 == 26190) s.add(a1 * 23 + a2 * 34 + a3 * 35 - a4 * 59 + a5 * 49 + a6 * 81 + a7 * 25 + a8 * 128 - a9 * 32 + a10 * 75 + a11 * 81 + a12 * 47 - a13 * 60 + a14 * 29 == 37136) s.add(a1 * 38 + a2 * 97 + a3 * 35 - a4 * 52 + a5 * 42 + a6 * 79 + a7 * 90 + a8 * 23 - a9 * 36 + a10 * 57 + a11 * 81 + a12 * 42 - a13 * 62 - a14 * 11 == 27915) s.add(a1 * 22 + a2 * 27 + a3 * 35 - a4 * 45 + a5 * 47 + a6 * 49 + a7 * 29 + a8 * 18 - a9 * 26 + a10 * 35 + a11 * 41 + a12 * 40 - a13 * 61 + a14 * 28 == 17298) s.add(a1 * 12 + a2 * 45 + a3 * 35 - a4 * 9 - a5 * 42 + a6 * 86 + a7 * 23 + a8 * 85 - a9 * 47 + a10 * 34 + a11 * 76 + a12 * 43 - a13 * 44 + a14 * 65 == 19875) s.add(a1 * 79 + a2 * 62 + a3 * 35 - a4 * 85 + a5 * 33 + a6 * 79 + a7 * 86 + a8 * 14 - a9 * 30 + a10 * 25 + a11 * 11 + a12 * 57 - a13 * 50 - a14 * 9 == 22784) s.add(a1 * 8 + a2 * 6 + a3 * 64 - a4 * 85 + a5 * 73 + a6 * 29 + a7 * 2 + a8 * 23 - a9 * 36 + a10 * 5 + a11 * 2 + a12 * 47 - a13 * 64 + a14 * 27 == 9710) s.add(a1 * 67 - a2 * 68 + a3 * 68 - a4 * 51 - a5 * 43 + a6 * 81 + a7 * 22 - a8 * 12 - a9 * 38 + a10 * 75 + a11 * 41 + a12 * 27 - a13 * 52 + a14 * 31 == 13376) s.add(a1 * 85 + a2 * 63 + a3 * 5 - a4 * 51 + a5 * 44 + a6 * 36 + a7 * 28 + a8 * 15 - a9 * 6 + a10 * 45 + a11 * 31 + a12 * 7 - a13 * 67 + a14 * 78 == 24065) s.add(a1 * 47 + a2 * 64 + a3 * 66 - a4 * 5 + a5 * 43 + a6 * 112 + a7 * 25 + a8 * 13 - a9 * 35 + a10 * 95 + a11 * 21 + a12 * 43 - a13 * 61 + a14 * 20 == 27687) s.add(a1 * 89 + a2 * 67 + a3 * 85 - a4 * 25 + a5 * 49 + a6 * 89 + a7 * 23 + a8 * 56 - a9 * 92 + a10 * 14 + a11 * 89 + a12 * 47 - a13 * 61 - a14 * 29 == 29250) s.add(a1 * 95 + a2 * 34 + a3 * 62 - a4 * 9 - a5 * 43 + a6 * 83 + a7 * 25 + a8 * 12 - a9 * 36 + a10 * 16 + a11 * 51 + a12 * 47 - a13 * 60 - a14 * 24 == 15317)
print(s.check()) print(s.model())
|
踩坑一:

这个z3好像不能给解,二进制左移7位就是乘2的7次方(128
踩坑二:
开心地去异或结果报错。。。

注意这个a1 a3 a9 a10 它换位了。。。无语
终于最后一步异或!
每一位和后一位异或,且最后一位不变(33是’!’),逆推就行
1 2 3 4 5 6 7 8 9 10 11 12
| a=[10, 24, 119, 7, 104, 43, 28, 91, 108, 52, 88, 74, 88, 33] flag = '!' b=12 temp=33 for i in range(13): c=a[b]^temp temp=c flag+=chr(c) b-=1
print(flag[::-1])
|
按题目要求取md5

(取32位 小写。。。完工!
buu上还有道羊城杯的ByteCode,看了一下。。!要手翻好长的python机器码啊啊啊,什么时候有空再做吧(咕。。。)