http://ctf.nuptzj.cn/challenges
Crypto篇:
第一题、第二题、第七题和CG-CTF一样,不写了…
第三题:
说了全家桶,那就python跑吧…
Flag:nctf{base64_base32_and_base16}
150分到手
第四题:
鬼知道进行了几次…
首先把base.txt中的回车都搞了,Notepad++吧,嗯。\r\n替换为空搞定。
搞完了就写个脚本跑一下,先跑他个100次试试…
# coding: utf-8import base64f = open('base64.txt','r')str = f.read()for i in range(0,100):str = base64.b64decode(str)print (str)
跑到出错,flag就出现了
Flag:nctf{please_use_python_to_decode_base64}
200分到手。
用Python解base64,嗯,记住了。
第五题:
给了个php函数。
大概思路就是先反转字符串,然后每一位都把它的ASCII码加一,然后反向打印base64,再rot13编码…
咋这么多步骤,那就php走起吧…
写了个php
<?php$str = "iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas";$str = base64_decode(strrev(str_rot13($str)));$_str = "";for ($i=0;$i<strlen($str);$i++) {$c = substr($str,$i,1);$__ = ord($c) - 1;$c = chr($__);$_str = $_str.$c;}echo strrev($_str);?>
放到phpStudy中跑一下,出结果。
Flag:nctf{rot13_and_base64_and_strrev}
250分到手
第六题:
给了个py
woc你是有毒吗?
人工解密吧,反正就十次…
第一次一看没有小写字母,base32,第二次只有数字,应该是base16,第三次只有数字和A-F字母,base16,第四次大小写都有,base64,第五次,base16,第六次,base64,第七次,base32,第八次,base16,第九次,base32,第十次,base32,然后出来了
真累,有没有别的办法…
百度了一下别的wp,
https://www.jianshu.com/p/b1e1214a72cb
上面那个师傅是按照爆破做的,学习了。
Flag:nctf{random_mixed_base64_encode}
第八题:
Python大法好
# coding: utf-8import hashlibstr1 = 'TASC'str2 = 'O3RJMV'str3 = 'WDJKX'str4 = 'ZM'for i in range(ord('A'),ord('Z') + 1):for j in range(ord('A'),ord('Z') + 1):for k in range(ord('A'),ord('Z') + 1):str = str1 + chr(i) + str2 + chr(j) + str3 + chr(k) + str4md5str = hashlib.md5(str.encode("utf-8")).hexdigest()print (str + ' ' + md5str + '\n')if (md5str[0:5]=='e9032'):exit()
然后就成了
其实应该再跑一次数字的,不过字母出了结果,数字就没必要跑了。
Flag:nctf{e9032994dabac08080091151380478a2}
300分到手
第九题:
加密算法看了一下,大概就是:
从一个文件中读取,如果读取不到换行符,就和给定的一个字符数组中的某个数异或,然后再以十六进制输出到另一个文件中。
嗯,好难…
首先我想的就是一个一个试吧…
这个不确定就一个一个试,这个
明文首先是可见的字符吧…所以说可以排除掉几个
上C++,C++大法好…
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>using namespace std;const int KEY_LENGTH_MAX = 13;const int KEY_LENGTH_MIN = 1;int main() {FILE *fpIn;unsigned char ch;string str = "\x00";fpIn = fopen("code.txt", "r");while (fscanf(fpIn, "%02X", &ch) != EOF) str += ch;fclose(fpIn);unsigned char ustr[471] = {};unsigned char xstr[471] = {};int a, b, c, d, e, f, g, h, k, l, m, n, p, i;for (i = 0; i < 471; i++) ustr[i] = str[i];unsigned char _key[13] = {};int KEY_LENGTH = KEY_LENGTH_MAX;for (; KEY_LENGTH != 0; KEY_LENGTH--) {for (a = 0; a < 256; a++) {_key[0] = a;for (b = 0; b < 256; b++) {_key[1] = b;for (c = 0; c < 256; c++) {_key[2] = c;for (d = 0; d < 256; d++) {_key[3] = d;for (e = 0; e < 256; e++) {_key[4] = e;for (f = 0; f < 256; f++) {_key[5] = f;for (g = 0; g < 256; g++) {_key[6] = g;for (h = 0; h < 256; h++) {_key[7] = h;for (k = 0; k < 256; k++) {_key[8] = k;for (l = 0; l < 256; l++) {_key[9] = l;for (m = 0; m < 256; m++) {_key[10] = m;for (n = 0; n < 256; n++) {_key[11] = n;for (p = 0; p < 256; p++) {_key[12] = p;unsigned char key[13] = {};for (i = 0; i < 13; i++) key[i] = _key[12 - i];for (i = 0; i < 470; i++) xstr[i] = key[i%KEY_LENGTH] ^ ustr[i];cout << "当KEY_LENGTH=" << KEY_LENGTH << ",密码表的遍历为";for (i = 0; i < KEY_LENGTH; i++) printf("%d ", key[i]);cout << "时,字符串解密如下:" << endl;for (i = 0; i < 470; i++) if (xstr[i] >= 32 && xstr[i] <= 127) printf("%c", xstr[i]);cout << endl;}}}}}}}}}}}}}}return 0;}
这个算法应该理论上是可行的,但是…按照这个算法跑估计跑到我结婚都跑不出来…
自闭了,还是看百度吧…
https://blog.csdn.net/jakekong/article/details/79884365
这篇文章有详细的解答
--------------------------------------------------
真的能跑出来!!!
---------------------------------------------------
学习中…