1.Training: Get Sourced (Training)
右键查看网页源代码,中间可以看到提示
把页面拉到最后也没看到有啥子,最后ctrl+f直接搜索关键词,发现在页面最下面的右下角
2.Training: Stegano I (Training, Stegano)
图片隐写,下载图片用记事本打开
3.Training: Crypto - Caesar I (Crypto, Training)
这里用了python暴力破解,但是答案一直提交错误,最后才发现26个字母打错了啊啊啊啊啊
message="BPM YCQKS JZWEV NWF RCUXA WDMZ BPM TIHG LWO WN KIMAIZ IVL GWCZ CVQYCM AWTCBQWV QA XXMZAUQMPNVL"
letters="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for key in range((len(letters))): #长度范围0-25
translate = ''
for symbol in message: #解密循环
if symbol in letters:
num = letters.find(symbol)
num = num-key
if num < 0: #判断得到的字母范围是否小于0,是的话加上26
num = num + len(letters)
translate = translate + letters[num]
else:
translate = translate + symbol
print("key %s:%s" %(key,translate)) #输出字符串
4.Training: WWW-Robots (HTTP, Training)
先访问https://www.wechall.net/robots.txt
得到
根据/challenge/training/www/robots/T0PS3CR3T访问PASS
5.Training: ASCII (Training, Encoding)
根据ASCII码对照表查找
6.Encodings: URL (Training, Encoding)
通过在线URL解码工具解码得到:
Yippeh! Your URL is challenge/training/encodings/url/saw_lotion.php?p=bhdggolmflpi&cid=52#password=fibre_optics Very well done!
7.2021 Christmas Hippety (Stegano)
8.Prime Factory (Training, Math)
#include<stdio.h>
#include<math.h>
int judge(long n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)return 0;
}
return 1;
}
int main()
{
long n=1000000,p1,p2,sum=0,m;
p1=n;
while(1)
{
p1++;
if(judge(p1)==1)
{
m=p1;
while(m)
{
sum+=m%10;
m/=10;
}
if(judge(sum)==1)
{
printf("%d",p1);
sum=0;
break;
}
else
sum=0;
}
}
p2=p1;
while(1)
{
p2++;
if(judge(p2))
{
m=p2;
while(m)
{
sum+=m%10;
m/=10;
}
if(judge(sum)==1)
{
printf("%d",p2);
break;
}
else
sum=0;
}
}
return 0;
}
9.Training: Encodings I (Training, Encoding)
下载JAR包,打开发现是一个解码软件,把密文粘贴进去,点击Binary中Binary Foramt,发现最后一行多出来一个0,ASCII编码有7位和8位,将BitsPerBlock改成7再点击Binary中Binary Foramt,最后选择Binary to ASCII
10.Training: Programming 1 (Training, Coding)
因为有时间要求,所以需要写一个脚本来运行,这里使用指定浏览器打开(一开始尝试的时候打开不了网页,可能是因为我的谷歌浏览器的文件名有问题,与路径上的exe不一致,重新打开浏览器之后就可以正常打开了)
import urllib.request
import http.cookiejar
import webbrowser
url1 = 'http://www.wechall.net/challenge/training/programming1/index.php?action=request'
url2 = 'http://www.wechall.net/challenge/training/programming1/index.php?answer='
header = {}
req = urllib.request.Request(url1,headers = header)
req.add_header('cookie','WC=15835712-61717-vFqauJSFWe8ek5Lw') #cookie(WC=11902277-43537-W2ovBL4df44puWJB)要用你自己的!!!
text = urllib.request.urlopen(req).read().decode('utf-8')
print(text)
url2 = url2+text
req = urllib.request.Request(url2,headers = header)
chromePath = r'C:\Users\admin\AppData\Local\Google\Chrome\Application\chrome.exe' #例如我的:C:\***\***\***\***\Google\Chrome\Application\chrome.exe
webbrowser.register('chrome', None, webbrowser.BackgroundBrowser(chromePath)) #这里的'chrome'可以用其它任意名字,如chrome111,这里将想打开的浏览器保存到'chrome'
webbrowser.get('chrome').open(url2)
11.Training: Regex (Training, Regex)
level1:/^$/
- ^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^字符本身,请使用 ^。
- $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
level2:/^wechall$/
level3:/^wechall4?.(?:jpg|gif|tiff|bmp|png)$/
- ? 重复零次或一次
- (?:exp)表示非捕获分组,匹配exp,不捕获匹配的文本,也不给此分组分配组号。
level4:/^(wechall4?).(?:jpg|gif|tiff|bmp|png)$/
- (wechall4?)用小括号来指定子表达式(也叫做分组)
12.Training: PHP LFI (Exploit, PHP, Training)
右键solution.php查看完整链接
从index.php跳转到solution.php需要经过两个父目录。
但是直接提交?file=…/…/solution.php会出错
原因是后面多了个.html,可以利用空字节%00来过滤掉后面的.html
13.PHP 0817 (PHP, Exploit)
switch/case 作的是松散比较。当一个非数字开头的字符串与数字0进行==比较时,结果总是true.因此可以直接提交solution作为which变量的值,"solution"相当于0,必然会执行require_once命令。
require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。equire_once() 是为了避免重复加载文件。
这里解决方法如下:
https://www.wechall.net/challenge/php0817/index.php?which=solution
14.Training: Crypto - Transposition I (Crypto, Training)
分析密文,开头的单词是Wonderful,每两个符号进行换位
#include<stdio.h>
#include<string.h>
int main()
{
char a[100],temp;
int n,i,j;
gets(a);
n=strlen(a);
j=0;
for(i=0;i<n;i++){
if(j%2!=0)
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
j++;
}
puts(a);
}
15.Training: Crypto - Substitution I (Crypto, Training)
通过这个在线网站,暴力破解 https://quipqiup.com/
cipher = "0F 37 37 2C 20 32 37 2A 74 20 41 37 3D 20 3B 37 34 3E 2D 2C 20 37 36 2D 20 35 37 3A 2D 20 2B 30 29 34 34 2D 36 2F 2D 20 31 36 20 41 37 3D 3A 20 32 37 3D 3A 36 2D 41 76 20 1C 30 31 3B 20 37 36 2D 20 3F 29 3B 20 2E 29 31 3A 34 41 20 2D 29 3B 41 20 3C 37 20 2B 3A 29 2B 33 76 20 1F 29 3B 36 6F 3C 20 31 3C 07 20 79 7A 00 20 33 2D 41 3B 20 31 3B 20 29 20 39 3D 31 3C 2D 20 3B 35 29 34 34 20 33 2D 41 3B 38 29 2B 2D 74 20 3B 37 20 31 3C 20 3B 30 37 3D 34 2C 36 6F 3C 20 30 29 3E 2D 20 3C 29 33 2D 36 20 41 37 3D 20 3C 37 37 20 34 37 36 2F 20 3C 37 20 2C 2D 2B 3A 41 38 3C 20 3C 30 31 3B 20 35 2D 3B 3B 29 2F 2D 76 20 1F 2D 34 34 20 2C 37 36 2D 74 20 41 37 3D 3A 20 3B 37 34 3D 3C 31 37 36 20 31 3B 20 38 3A 3A 31 30 29 2B 36 2D 2B 31 3A 76"
cipher = cipher.split()
#对整个字符串循环
for shift in range(127):
#遍历字符串的每个字符
for every in cipher:
current = int(every, 16)+shift+1
print(chr(current % 128), end='')
print()
print(shift+1)
16.Training: Crypto - Digraphs (Crypto, Training)
将两个符号替换成一个符号,再通过https://quipqiup.com/破解