1. 程式人生 > >2018安恆杯10月月賽RE&MISC週週練

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

發現有很多流量,應該是成功了第一步吧……

然後……啥東西啊,流量分析我一點也不懂