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)
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 //码表处理 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进行运算得到明文。