YoungterDriver

多线程操作,要考虑多个线程同时进行的作用!

启用两个线程交替对flag进行处理,最后比对其值

第一个线程

第二个线程

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
offstr = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmm"
key = "TOiZiZtOrYaToUwPnToBsOaOapsyS"
flag = ''

for i in range(len(key) ):
if i % 2 == 1:
for n in offstr:
if 'A' <= n <= 'Z':
if offstr[ord(n) - 38] == key[i]:
flag += n
break

if 'a' <= n <= 'z':
if offstr[ord(n) - 96] == key[i]:
flag += n
break
else:
flag += key[i]

print(flag)
#TOdZhZsOsYhTeUdPfTiBdOwOhhkyS
#dhsshedfidwhhk

signin

RSA加密;

yafu分解大数质因数,gmpy2求模数、n、私钥、密钥。

[ACTF新生赛2020]usualCrypt

很明显的base64,但是解密并无有效信息,查看编码程序,在编码前对码表进行了处理:

码表处理程序

而编码完毕之后,返回的是一个处理的函数:

最后处理的函数

审计发现为大小写转换函数,于是便可以编写脚本:

首先对最后的编码结果进行大小写转换。再根据程序产生的码表和base64原码表进行转换,便可以得到原始的正确的base64编码结果,最后再decode。

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//码表处理
#include <stdio.h>

void main(){
char key1[] = "ABCDEFGHIJ";
char key2[] = "KLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int i;
char temp;
for(i = 6; i < 10; i++){
temp = key1[i];
key1[i] = key2[i];
key2[i] = temp;
}
for(i = 10; i < 15; i++){
temp = key2[i];
key2[i] = key2[i - 10];
key2[i - 10] = temp;
}
printf("%s%s", key1, key2);

}

//ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#大小写转换并恢复编码
surface = {'A': 'A'}
key = 'ABCDEFQRSTUVWXYPGHIJKLMNOZabcdefghijklmnopqrstuvwxyz0123456789+/'
key2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
flag = 'zMXHz3TIgnxLxJhFAdtZn2fFk3lYCrtPC2l9'
f = flag.swapcase();
k = ''

for i in range(len(key)):
surface[key[i]] = key2[i]

for i in f:
k += surface[i]
print(k)

RSA

提供公钥和密文,通过公私钥分解出指数e和模数n,再用yafu和gmpy2进行运算得到明文。

2021-07-06
Contents

⬆︎TOP