十月月赛反正我是错过了,这次周周练有四道题来看看,菜鸡就该多学习
1.easytree
拖进linux,发现跑不起来,eng? file一下,结果发现是exe
PEID查一下
upx壳,直接脱,拖进IDA,直接看main函数
依次分析一下函数吧,2400不知道是啥,198E里面就是欢迎我们的字符串
我们输入的的字符串长度要是15才行
最后我们运算一通之后字符串要转变为aWNuZXJyc2VhZXRydmVl,长度是20
长度从15变成20,多了四分之一,怀疑是base64我觉得还是比较合理的233
我们看函数401794,如下
的确基本就是base64加密的流程,看一下加密字典
没有改变过,我们安心的base64解密一波:icnerrseaetrvee
我们上面的两个函数肯定还有些操作,结合题目,我们来一手眼拔flag…………
tree can reverse i
flag:icanreversetree,然后不对,奇怪,谁能救救我,自救吧……
看一下前面的函数,如下
学过数据结构的话,可以看出来这是个二叉树,也没什么特别的变换,看下一个函数
这是一个迭代函数,结合二叉树,猜测是遍历二叉树的算法,一共就三种遍历方式
原文:icnerrseaetrvee
前序:icanreversetree
中序:太扯淡了吧……
OD调一下,感觉也没问题,emmm咋回事
2.BASE++
直接给了我ida分析的文件,打开看一下主函数,如下
有三个transfrom函数,一上来还会判断字符串长度是否小于32,转换后的字符串要等与TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D====,思路还是清晰的,分析一下函数
transfrom1这一看就是个转换,如下
是一个替换小写字母的转换
看transfrom2,发现里面还嵌套着transfrom1
在transfrom里面看见了一个字典,如下
但是别高兴的太早,对字典有一些操作,也就是说,现在只是伪字典,如下
脚本
s='BCDEFGHIJKLMNOPQRSTUVWXYZ'
key=''
for i in range(len(s)):
if i%2==1:
key+=chr(ord(s[i])+32)
else:
key+=s[i]
key+='765432'
print(key) #BcDeFgHiJkLmNoPqRsTuVwXyZ765432
这密码表和base64的密码表长度相同,结合题目,可以理解为这题是base加密的变形,这里替换表发现少了一位,后面我自己补上了
然后分析第三个transfrom,如下
给了我个注释,五步一变,一变变五,转换全靠base_tran_5这个函数
switch算是一个补齐操作,缺的补等号,可以说是很base了,看最后一段长度是否是8的倍数,不是的话补等号
直接替换base的编码表运算一波,至于是base32还是64的话,因为这里有个小写字母的操作,比较符合base32,所以我就先base32了
import string
import base64
my_base64table = "BcDeFgHiJkLmNoPqRsTuVwXyZa765432"
std_base64table ="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
s = "TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D===="
s = s.translate(string.maketrans(my_base64table,std_base64table))
print base64.b32decode(s)
但是不幸的是,解出来是乱码,一定是哪里出了问题,回上去看吧,又要多掉些头发了
后来发现密码表我们在静态里看到的只是第一步,第二步没发现,在动态里还有第二步,结果如下
真叫人头秃,后面记得补上765432
再次解码得到:10n78ppn3ro00o70r2opop5s3roqq937
再经过transfrom1,逆回去就好啦
3.just do it
打开压缩包,里面有个txt,里面的内容看上去是base,解密一下
另外个稳文件file一下
是个pyc文件,反编译一下,有了函数逆一下就好了,res为38位去掉flag{}正好32位,猜是md5,爆破加逆向
import random
res=[33, 33, 90, 88, 6, 27, 36, 11, 59, 33, 47, 74, 28, 26, 6, 0, 15, 40, 100, 98, 96, 3, 52, 87, 94, 89, 65, 50, 51, 48, 38, 67, 100, 54, 45, 33, 39, 66]
ran = random.randint(99, 109)
#print(ran)
key = [
151,
157,
163,
167,
173,
179,
181,
191,
193,
197,
199,
211,
223,
227,
229,
233,
239,
241,
251,
257,
263,
269,
271,
277,
281,
283,
293,
307,
311,
313,
317,
331,
337,
347,
349,
353,
359,
367]
for i in range(99,109):
flag = ''
for j in range(len(res)):
n=0
while(True):
temp = (res[j]+n*i)^key[j]
if (temp > 47 and temp <58) or (temp>96 and temp <103):
flag+=chr((res[j]+n*i)^key[j])
break
elif n > 10:
break
else:
n+=1
print(flag)
取后32位就好了
4.未知流量
打开压缩包是两个文件
我先吧pcapng转成pcap,然后又用wireshark分析test2,不知道要干嘛,然后用wireshark打开pcapng和pcap
发现有很多流量,应该是成功了第一步吧……
然后……啥东西啊,流量分析我一点也不懂