2020V&N招新赛Misc

2020V&N招新赛Misc

三月 01, 2020 (Updated: )

拉胯的三条命令

打开压缩包结合题目描述,可以猜测这是一个nmap扫描端口的流量包,然后让找到开放的端口从小到大排列。Wireshark中nmap扫描流量,如果端口开放,则必有ack回应。
而且wireshark对于正常通信的tcp流量貌似都是高亮显示,ok,直接查看高亮的流量,统计这些流量的端口,其中有个重要的小细节,对于80端口的流量,因为其默认类型被当作http端口,所以wireshark会直接将其高亮,要看一下他的ack值是否为零才能正确判断80端口是否开放。于是得到一下端口号:
21
22
631
801
3306
5939
32848
60206
其中5939、32848、60206三个端口存在大量的“流量”,这不应该是端口扫描的流量,端口扫描是探查端口状态的,不应该有大量的数据交换,所以不考虑这三个端口,剩下的端口从小到大排列试一下,正确

ML第一步

创建实例后浏览器直接访问发现这不是网站服务,那应该是应用类服务,用nc连接。

link

总之意思就是有一个未知函数y=f(x),给出70组(x,y)。让我们求它的拟合方程。
然后他会给出10个x,让我们用拟合方程推测y的值,如果结果误差不超过0.06,就可以得到小旗子。
用python的matplotlib.pyplot画出散点图发现70组数据接近一条直线,直接脚本求解线性回归方程,然后去拿flag。求解脚本如下(ps:因为散点图的这条线有一点点弧度,所以我用了四次多项式,没有直接用一次的直线):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

import numpy as np
from matplotlib import pyplot as plt

def f_fit(x,y_fit):
a,b,c,d,e=y_fit.tolist()
return a*x**4+b*x**3+c*x**2+d*x+e

data = "x=0.7587857855539164,y=-1.720845811051089\
;x=0.13291321567620085,y=-0.44979144628012097\
;x=0.989974986143239,y=-1.9690360825859337\
;x=0.3576179200089157,y=-0.9003680552893811\
;x=0.6031957139605361,y=-1.413869207317482\
;x=0.8655969454196368,y=-1.8874775800952617\
;x=0.48683649837550014,y=-1.2221034522056922\
;x=0.1279800851084858,y=-0.3598626690513456\
;x=0.01840117269743846,y=-0.0825695560842738\
;x=0.49065439417804224,y=-1.2151317607134124\
;x=0.745683162567403,y=-1.6542547149837732\
;x=0.564686557840641,y=-1.4086742079578898\
;x=0.5506578263400632,y=-1.328319038372737\
;x=0.09890521425587329,y=-0.268867793932863\
;x=0.9653080707668127,y=-1.9926065934683845\
;x=0.49189934250857936,y=-1.2041799438406553\
;x=0.47460948035678996,y=-1.1919570601329146\
;x=0.7296637598789997,y=-1.626555486935713\
;x=0.8772637406893159,y=-1.8444895108368027\
;x=0.5262847068436897,y=-1.26898790243642\
;x=0.18375224095950315,y=-0.49792227912640824\
;x=0.5302276810137457,y=-1.3245875742508557\
;x=0.44598041870724514,y=-1.1407183813974087\
;x=0.9297802591112221,y=-1.9038682460892118\
;x=0.31768338032416477,y=-0.8380436760373051\
;x=0.31932181828715034,y=-0.885221801261295\
;x=0.6520599635229203,y=-1.5648743849645852\
;x=0.6318704181747703,y=-1.5361822819084332\
;x=0.33596049748295764,y=-0.9018941515966336\
;x=0.1582929490762487,y=-0.4621575450764881\
;x=0.611161054351204,y=-1.4819230001079216\
;x=0.2273505730886458,y=-0.6426008674876235\
;x=0.3434775350774453,y=-0.9440612715950338\
;x=0.3424015864156754,y=-0.8739934996421624\
;x=0.8593474128108042,y=-1.8415838175212416\
;x=0.9385785550053852,y=-1.9041364608079328\
;x=0.4943478784921591,y=-1.2315495557049194\
;x=0.45739416734634764,y=-1.1594371513265878\
;x=0.8929294113779981,y=-1.8615545670417983\
;x=0.19881908699665485,y=-0.5530975791426536\
;x=0.06396527084952186,y=-0.2248085775384525\
;x=0.2686482544684099,y=-0.75603686845716\
;x=0.6084930406339851,y=-1.4717769288575426\
;x=0.22216290869419308,y=-0.5906772203093745\
;x=0.5914604953995254,y=-1.4177038761692764\
;x=0.2036532638797327,y=-0.5788918140417649\
;x=0.4558490044828919,y=-1.1682771304121138\
;x=0.18324091786354268,y=-0.5788763881712895\
;x=0.5421407829934451,y=-1.328797280920123\
;x=0.4056810838054147,y=-1.0890377739166588\
;x=0.39311134509953427,y=-1.037818315593108\
;x=0.452612604644542,y=-1.2237566644854736\
;x=0.2615352628059312,y=-0.70346972932896\
;x=0.8901625763679877,y=-1.8806707950314019\
;x=0.28280744763980337,y=-0.8231345793908345\
;x=0.09628463850897795,y=-0.24971993270496043\
;x=0.16481384396642307,y=-0.46946630708368303\
;x=0.2847357540218156,y=-0.7947718784607872\
;x=0.5319011449268986,y=-1.2668856188466802\
;x=0.1081951088228772,y=-0.2536241872065086\
;x=0.08836473591694316,y=-0.23153637261490673\
;x=0.38840371594123335,y=-1.0336677376652563\
;x=0.7720822530882997,y=-1.6953637803062263\
;x=0.36229637982212415,y=-0.9854786906183374\
;x=0.9519976240184558,y=-1.929418000224495\
;x=0.5783183065134814,y=-1.3777929584428186\
;x=0.5906565476132922,y=-1.4103866887242276\
;x=0.8171334469097077,y=-1.748680676187232\
;x=0.668796106230006,y=-1.5411754553626387\
;x=0.581250276261842,y=-1.395451210048179"

data_list = data.split(";")
x = []
y = []

for i in data_list:
i_list = str(i).split(',')
x.append(float(i_list[0][2:]))
y.append(float(i_list[1][2:]))

x = np.array(x)
y = np.array(y)

y_fit=np.polyfit(x,y,4)#二次多项式拟合
y_show=np.poly1d(y_fit)#函数优美的形式
print(y_show)#打印
y1=f_fit(x,y_fit)
plt.plot(x,f(x),'r',label='original')
plt.scatter(x,y,c='g',label='before_fitting')#散点图
plt.plot(x,y1,'b--',label='fitting')
plt.title('polyfitting')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()#显示标签
plt.show()

然后去用得到的函数式推测十个y值,得到flag(如下图):
VN-ML2.png

内存取证

检查镜像信息,然后终端进程文件查看一条龙。
终端没有发现什么有用的,进程直接浏览器记事本画图磁盘加密四个emmm,文件查看什么都没有。
一开始想用notepad查看记事本内容,然后发现不支持。无奈-h查看帮助,看了半天找到一个editbox,可以查看编辑器的内容,于是成功获得百度云分享链接内容:
VN-内存1.png
拿到一个VOL,很明显这应该就是加密的磁盘文件,将Truecrypt进程dump下来,用efdd工具破解密码挂载到本地,获取到key:uOjFdKu1jsbWI8N51jsbWI8N5。
至此四个进程用去三个,很明显最后的提示信息应该就在画图进程里。
将mspaint进程dump出来,用gimp分析,宽1728,偏移2kw时,得到:
VN-内存2.png
好了,剩下的真不行了,图像信息只分析出来这一个,不知道这个字符串怎么和key用,推测是一种加密,但没找到别的提示信息,搞不定了emmmmm
套娃可耻!!!到网上下载一个TrueCrypt,用它挂载VOL,密码就是刚刚的key,然后拿到压缩包,密码是上面的画图的内容,开头那个是‘1’,一开始以为是I,然后不对就试了下‘l’和‘1’,出了flag

Final Game

Malebolge Online

题目有一个压缩包和一个vmdk,先看看压缩包,里面有个文本,说是一些有用的东西,看来是解题提示,但是加密了,旁边还有注释。说要去要去地狱的第八层emmm
发现加密文本的文件名也是地狱的英文单词,谷歌一下看看是不是有猫腻。这里有一说一运气了一下。
直接搜索这个单词只能搜出来相关的宗教知识,不过因为我懒得手打,就f2 文件,然后 ctrl a ctrl c 了,于是我谷歌的是这个单词后面跟了 .txt 的后缀,直接就搜出来一个 Malebolge online ,打开发现也是一种类似 brain fuck 的语言,很明显,注释里面的内容拉进来运行,得到一串字符串,这应该就是解压密码了。
然后解压缩成功,打开文本查看提示:
VN-FG1.png
很明显,这些就是解题相关的文件。接下来该去看vmdk了。

vmdk find file

7z打开vmdk,发现这真就把c盘弄下来小半emmm,听人说里面有lamber师傅的照片,本来准备直接拿相关文件的手控制不住的就一个个文件夹的点过去找照片了2333。
咳咳,说正经的说正经的。这里直接用修改时间排序查看最后修改的文件夹,一般和题目相关的文件都是最后修改或者访问的,毕竟出完题要先测试一下复现。
VN-FG2.png
这里有个坑,只看修改时间和访问时间会发现只有它是放题的地方,但是如果进入到下面的 user 文件夹下的 lenovo 会发现外面看修改和访问都是11月1日,进去之后反而有6号和7号的,还好我为了找某人的照片专门跑过来看了2333
VN-FG3.png
所有放题目文件的位置都找到了,一一把题目文件提取出来。

NTFS + ELF

发现各个文件不是结构有问题就是有密码,这时想到提示说有ntfs,就用工具扫了一下,发现 door.png 后面藏了一个exe,运行一下他说要放在炼狱下运行。又提示 Mr.png才能上天堂,这里我一开始以为是有什么png图片需要拿过来,但是找了半天找不到别的啥图片555,然后干脆去逆向分析这个exe。
于是乎,一个下午没了,这程序保护全开上的强壳,吐了。后来突然想到是不是把别的题目文件和它放一起就行了,就把别的文件拉了过来。ok,拿到提示:需要修复elf。

~这里又是几个小时各种查elf修复emmm。被自己蠢哭,这是misc不是re!!!~

按照misc的文件修复思路走那坑定是个别固定的文件十六进制数据被修改了,于是直接搜索elf的文件格式,发现文件开头应该是 7f 的被改了,改回来。然后试了下用kali运行,发现报错,可能是改了别的地方,这里百度到可以用Linux下的 readelf -h filename 查看elf文件的结构信息,发现elf类型是none,猜测是这里错了。这里我用了 010 Editor 的模板功能,这玩意真好用,直接一键选择类型。
VN-FG4.png
然后运行程序:
VN-FG5.png
emmm,还是ida看一下吧。箭头指向的应该是main函数地址。
VN-FG6.png
分析main函数,发现这里进行了一次判断,如果向程序传参的值大于1,则跳过该处。
VN-FG7.png
传一个参数 2 运行试试:
VN-FG8.png
得到提示,很明显是让我们解md5,在线网站跑一下,得到 evoA
这里我没分析出来v4的值受什么影响,不过看到这个evoA,我猜测v4[1]是传入参数的字符长度,那么接下来把evoA作为参数传入。
VN-FG9.png
得到一串字符,开头是pdf,应该是pdf的密码。去查看pdf内容。

PDF

VN-FG10.png
键盘密码,看着键盘转换一下,根据明文内容可知表情符号是空格。得到:

The password of word is capital(PROVERBS OF GOD)

Word

拿到word压缩包的密码,去查看word,打开发现是一个图片的十六进制,因为字符太多,这里我用脚本转了,python的python-docx库可以操作docx,先把docm格式另存为docx格式,提示有宏,先看一下宏的内容
VN-FG11.png
是一堆base64,写个脚本解一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import base64

# 考虑到base64隐写,先解一下base64,这里有个不算坑的坑,宏生成的文本换行只有一个\r,没有\n,所以python会把其当作一行
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

with open('ba.txt', 'r') as f:
bin_str = ''
flag = ''
lines = f.readline().split('\r')
for line in lines:
stegb64 = str(line).replace("\r","\n").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64))).strip("\n")
offset = abs(b64chars.index(stegb64.replace('=','')[-1]) - b64chars.index(rowb64.replace('=','')[-1]))
equalnum = stegb64.count('=') #no equalnum no offset
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
#flag += chr(int(bin(offset)[2:].zfill(equalnum * 2), 2))
#print(flag) #这样写得不出正确结果
print(''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)]))

#这里是正常解文本base64
try:
while True:
with open('ba.txt','r') as fi,open('ba_de','wb') as io:
for i in fi.readlines():
#print(type(i.strip()))
io.write(base64.b64decode(i.strip()))
shutil.copy('ba_de','ba_de.tmp')
os.remove('ba.txt')
os.rename('ba_de','ba.txt')
except:
print('finish')

运行发现base64藏了东西。
VN-FG12.png

然后再去查看十六进制转换出来的文件,是一个被修改了文件头的png,改回来,stegslove发现存在lsb隐写,推测是带密码的lsb,用GitHub上的cloacked-pixel解,上面的base64隐写内容为密钥
VN-FG13.png
得到最后osz文件压缩包的密码。
VN-FG14.png

OSZ

这里我以前没玩过osu,所以就按照正常流程走。
其实玩过的大佬直接还是要正常走下去23333
拖进kali里面发现直接变成了压缩包图标的文件,解压缩得到一个文件夹
VN-FG15.png

进去看看: 一堆音频和一个Read.jpg加一个osu后缀的疑似文本的文件.
VN-FG16.png

文本打开osu后缀的文件,顺便strings看一下Readme.jpg
VN-FG17.png

jpg结尾跟的有东西,osu后缀给了一个b站av号。先查看这个av号的视频。发现是一个叫osu的音频相关的编辑器,搜一下,知道是一种音游,比节奏大师要难很多emmm。下载osu!,将paradise.oszosu!打开,然后没发现什么问题,不过大概了解一下玩法,推荐看到的各位入手嘿嘿嘿。再去看看jpg后面的内容:

in,map.flag,is :0036112S0038362y0042112c0055162{011091201187120135512014211201581630200412020386202163120219762022531202313120251862030251203121120318412032962803424120352837035853704093370420137044346204471370450062045786205147370514737051586205165370525312052606205301870548562}Traversing.Time

在map里,flag是xxxxxxx,结合它的玩法和群里师傅的说法,看来是让我画flag了emmmm,把字符Syc{前的数字当成时间,进入地图编辑器里查看相关时间的内容发现

VN-FG18.png
VN-FG19.png
VN-FG20.png
VN-FG21.png

果然是看图像拼flag,这里就跟着时间节点一个个记录flag数值即可。
在记录一下拼flag时遇到的小坑:
20200303184416.png
这几个选择全部关掉!!!不然后面有几个字符显示的部分不全认不出来是什么emmm,还有下面这里,一开始我记录flag的时候有好几个都是这样给了一个点,给我整蒙了,后来意识到这点上有数字,这个数字就是flag的值emmm,剩下的就是看形状了,反正md5的字符是十六进制的字符,实在顶不准就标记一下手工爆破吧,这里实在不想再回去一个个复查了555
20200303184637.png))))

隐藏