2018安恆杯10月月賽RE&MISC週週練
十月月賽反正我是錯過了,這次週週練有四道題來看看,菜雞就該多學習
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
發現有很多流量,應該是成功了第一步吧……
然後……啥東西啊,流量分析我一點也不懂