羊城杯
- easyre
- login
easyre
打开一看非常明了,输入的字符串经过三次加密后和Str2比较 用Str2往回逆即可 倒着逆 第三次加密:好像是后移三位的凯撒但又不完全是。。唉不会就爆破 第二次加密:13位位一组调换了前后顺序,换回去即可 第一次加密:最后解一个base64
#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!!!
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是’!’),逆推就行
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机器码啊啊啊,什么时候有空再做吧(咕。。。)
|