Exp10 Final 「西普杯」北京天津CTF預選賽真題 writeup

寫在前面:

1.爲何作免考?

主要是想挑戰一下本身,提升一點能力,以前在學校信安大賽的時候就對這方面有一些涉獵,但願可以經過完成這兩套題目,水平獲得進一步的提升。也但願可以給下一屆參加信安大賽的學弟學妹們一些方法上的啓發。python

2.免考內容:

1.學校信安大賽網絡攻防三等獎編程

2.西普杯北京+天津預算選賽CTF12道真題writeupvim

在這裏我選用的是西普杯北京+天津預算選賽的題,發現前面的同窗@盡白已經對北京預選賽的第一道題進行了多方位全角度深層次的剖析,那第一題我也不過多贅述了,直接從第二題開始吧。windows

免考題:

1.WTF?

題目類型:安全雜項數組

題目描述:安全雜項-經過奇怪的字符串發現其中隱藏的信息。sass

點擊題目給出的連接後發現是一串奇怪的字符。安全

 

 在字符串的末尾發現有兩個等於號,因而大膽猜想這是一個base64編碼,可是現有帶窗體的相關工具不支持這麼大的轉碼量,這時候咱們可使用python編寫一個轉碼程序。不過正好保密督查實驗有一個轉碼工具,直接拿來使用。網絡

 

轉碼結果略微眼熟。。。這不是日常使用的二維碼嗎???但是這麼大徹底掃不出來。編輯器

在工具欄——格式——字體裏調整記事本字體,進行掃描,獲得flag。(這裏可能仍是會掃不出來,能夠經過圖像處理軟件調整圖片的灰度、亮度,這樣掃描的成功率會更高。)ide

 

2.分道揚鑣

題目類型:逆向工程

題目描述:注意進入正確的流程,用最短的步驟走完迷宮。

點擊連接,下載題目給出的文件,執行後要求輸入字符串。隨意輸入,提示輸入錯誤。

 沒有頭緒,仍是直接使用winhex分析文件看看吧。

winhex 是一個專門用來對付各類平常緊急狀況的工具。它能夠用來檢查和修復各類文件、恢復刪除文件、硬盤損壞形成的數據丟失等。同時它還可讓你看到其餘程序隱藏起來的文件和數據。整體來講是一款很是不錯的 16 進制編輯器。獲得 ZDNetSoftwareLibrary 五星級最高評價,擁有強大的系統效用。

將文件拖入winhex,發現一處可疑的地方,這句「Please input your key:」和以前運行時輸出的語句如出一轍,可是以後一連串字符串仍是讓人摸不着頭腦,這就觸及到知識盲區了。

可是這道題的類型是逆向工程,是否是能夠嘗試使用逆向工具來進行實驗。

查詢一番我找到了一個所謂「逆向神器」的IDA Pro(Interactive Disassembler Professional),即交互式反彙編器專業版。

它是目前最棒的一個靜態反編譯軟件,爲衆多0day世界的成員和ShellCode安全分析人士不可缺乏的利器!IDA Pro是一款交互式的,可編程的,可擴展的,多處理器的,交叉Windows或Linux WinCE MacOS平臺主機來分析程序, 被公認爲最好的花錢能夠買到的逆向工程利器。IDA Pro已經成爲事實上的分析敵意代碼的標準並讓其自身迅速成爲攻擊研究領域的重要工具。它支持數十種CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

將可執行文件拖入ida中,發現是難以琢磨的彙編語言,將其反彙編成C語言。

尋找一番以後發現可疑代碼!(點擊加號查看)

 1 char *sub_401020()
 2 {
 3   char *result; // eax
 4   char *v1; // [esp+50h] [ebp-CCh]
 5   char v2; // [esp+54h] [ebp-C8h]
 6   char v3; // [esp+5Dh] [ebp-BFh]
 7   char v4; // [esp+94h] [ebp-88h]
 8   char v5; // [esp+98h] [ebp-84h]
 9   char v6; // [esp+99h] [ebp-83h]
10   __int16 v7; // [esp+10Dh] [ebp-Fh]
11   char v8; // [esp+10Fh] [ebp-Dh]
12   char v9; // [esp+110h] [ebp-Ch]
13   char v10; // [esp+114h] [ebp-8h]
14   int v11; // [esp+118h] [ebp-4h]
15 
16   v5 = 0;
17   memset(&v6, 0, 0x74u);
18   v7 = 0;
19   v8 = 0;
20   strcpy(&v2, "********* *    ** * ** ** * ** ** * #* ** **** **      *********");
21   v1 = &v3;
22   printf("Please input your key:\n");
23   gets(&v5);
24   if ( strlen(&v5) != 22 )
25   {
26     printf("Sorry you are wrong!\n");
27     system("pause");
28     exit(1);
29   }
30   v11 = 0;
31   do
32   {
33     v10 = *(&v5 + v11);
34     if ( v10 != 107 && v10 != 106 && v10 != 104 && v10 != 108 )
35     {
36       printf("Sorry you are wrong!\n");
37       system("pause");
38       exit(2);
39     }
40     v9 = *(&v5 + v11);
41     switch ( v9 )
42     {
43       case 104:
44         if ( --v1 < &v2 || v1 > &v4 || (result = (char *)*v1, result == (char *)42) )
45         {
46           printf("Sorry you are wrong!\n");
47           system("pause");
48           exit(3);
49         }
50         if ( *v1 == 35 )
51         {
52 LABEL_41:
53           printf("Good!\n");
54           system("pause");
55           exit(0);
56         }
57         break;
58       case 106:
59         v1 += 8;
60         if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
61         {
62           printf("Sorry you are wrong!\n");
63           system("pause");
64           exit(3);
65         }
66         result = (char *)*v1;
67         if ( result == (char *)35 )
68           goto LABEL_41;
69         break;
70       case 107:
71         v1 -= 8;
72         if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
73         {
74           printf("Sorry you are wrong!\n");
75           system("pause");
76           exit(3);
77         }
78         result = v1;
79         if ( *v1 == 35 )
80           goto LABEL_41;
81         break;
82       default:
83         if ( ++v1 < &v2 || v1 > &v4 || *v1 == 42 )
84         {
85           printf("Sorry you are wrong!\n");
86           system("pause");
87           exit(4);
88         }
89         result = v1;
90         if ( *v1 == 35 )
91           goto LABEL_41;
92         break;
93     }
94     ++v11;
95   }
96   while ( v11 < 25 );
97   return result;
98 }
View Code

通過分析咱們發現只能輸入ASCII碼爲10七、10六、10四、108的字符,即爲k、j、h、l

根據v5相關代碼易發現v5表明輸入的字符串,而這個字符串長度必須恰好是22,與奇怪的字符串內空格的數量相等。尋思着是否是輸入的hjkl與星號的排列有什麼聯繫,而題目描述代表了這是一個走迷宮的題目。鼓搗一番字符串以後發現這是一個8*8的矩陣迷宮!而輸入的hjkl顯然就是vim編輯器裏經常使用的上下左右,這決定了迷宮的走向!

再對代碼進行分析,發現只有路徑不通過星號字符串纔有效,而到達井號即爲到達終點。這正好解答了上一步中空格數量爲何與應輸入字符串的長度相等

 

因而嘗試將vim編輯器內的hjkl表明的左上下右直接套入題目中,迷宮路線即爲jjjjjlllllkkkkkhhhjjjl

 

解密成功。

 

3.10000000

題目類型:逆向工程

題目描述:尋找正確的輸入。

有了以前題目的鋪墊,作這道題輕車熟路了些。

顯示打開可執行文件,發現仍是一道輸入的題目。

把文件拖入ida內進行分析,發現主函數內關鍵代碼:

 

經過聯繫其餘函數進行分析後能夠知道,這個可執行程序是先壓棧一些字節,用戶輸入字符串以後,將其與80做or運算,將運算結果與壓棧的字節進行比較,若相同則答案正確,不一樣則錯誤。

因此咱們須要作的是先取出壓棧字符,再將其與80做xor運算,便可獲得應當輸入的字符。

編寫一個C語言程序,進行遍歷破解。

 

獲得解密文本:flag:testtest。

 

4.大數據問題

題目類型:編程

題目描述:小明剛剛學習計算機編程,老師給他出了這樣一道題目,可是他怎樣思考,都作不出來,因而,只好請教高手的你了。 
sum = 1!+2!+3!+……+6788!+6789!的末5位。

 

若是直接莽過去的話,電腦會直接死機以示抗議。

因此咱們在每一步的計算中直接區最後五位,不考慮其餘的位數,能夠大大減小計算量,而且咱們發現這道題不用計算25之後的階乘,由於4*5*10*25=100000,25以後的的階乘對後五位已經不產生影響了。

編寫程序進行計算:

獲得答案爲40313。

 

5.打不開的文件

題目類型:隱寫術

題目描述:隱寫 咦!這個文件怎麼打不開?

右鍵另存,能夠看到這是一個gif文件,可是文件仍然打不開。但在使用winhex查看的時候,我發現並無文件頭。

 

gif文件的文件頭是GIF8,直接在notepad++內加入文件頭便可。

 

更改以後直接打開,獲得一個4幀的gif動圖,找準時機分別對截取圖片,發現獲得的是一個base64編碼。

 

經過base64解碼獲得flag爲:this is a gif

  

6.疑惑的漢字

題目類型:密碼學

題目描述:現有一段通過加密的密文,內容以下: 

王夫 井工 夫口 由中人 井中 夫夫 由中大 
請找出這段密文隱藏的消息明文。

通常來講帶漢字的密碼類題目都是簡單密碼,不涉及更深層次的計算,並且初見這道題爲什麼如此眼熟。。。似裏!行測!行測裏的圖形題也有涉及到相似的知識與規律。

因而我嘗試着用行測的方法來進行解題,終於發現了規律:漢字有非閉合部分幾個分支就表明着是數字幾。

獲得結果:67 84 70 123 82 77 125

對照ascii碼錶進行轉換,獲得結果:

CTF{RM}

後來查了一下,這叫當鋪密碼(從名字看得出來應該是中國古代勤勞的勞動人民發明的吧。。)

 

7.功夫祕籍

題目類型:安全雜項

題目描述:傳說獲得這個祕籍的人都修煉成了絕世神功

點擊題目連接,下載到文件kongfu.rar,文件沒法打開,把文件拖入winhex中進行分析,發現這實際上是一個png圖片。

直接修改文件文件後綴,再嘗試打開文件,發現文件可以打開了。

再在winhex中進行查看,搜索key能夠找到結果,不過這裏我使用了Stegsolve.jar對圖片進行分析。

Stegsolve.jar是一款圖像隱寫工具,支持使用不一樣方式解除圖像隱寫,是圖像隱寫的必備工具,而且當兩張jpg圖片外觀、大小、像素都基本相同時,還能將兩個文件的像素RGB值進行XOR、ADD、SUB等操做,看可否獲得有用的信息。

使用File Format選項查看能夠發現有一串字符

 

仍是咱們的老朋友base64編碼,進行解密以後居然仍然是一串亂碼,不過貌似發現內容裏有KEy的字樣,猜想是經過某種編碼手段將字符串打亂後的結果。

耗盡了知識儲備仍是沒能解出答案,查了一下相關資料,發現這是一個柵欄密碼。

通過每組字數3的解密後,獲得答案:

 

8.just click

題目類型:逆向工程

題目描述:拿到答案須要正確地點擊按鈕

先點擊連接下載程序,打開程序是四個按鈕:

將可執行程序放入ida中發現是一個C#程序,咱們這裏可使用ILSpy進行反編譯。

ILSpy 是一個開源的.NET反編譯工具,簡潔強大易用是它的特徵。在絕大多數狀況下,它都能很好的完成你對未知程序集內部代碼的探索。

 

界面中的succeed是正確後的輸出,因此咱們應該講讓flag4知足true,則Correct要等於8,而correct初始值爲0,因此須要經過flag3那裏來增長correct的值。通過分析後獲得,輸入的內容要爲數組array[1]~array[8]的值。對應的數字也就是按鈕上的數字。

按照13421234的順序點擊按鈕,獲得flag。

 

9.解碼磁帶

題目類型:安全雜項

題目內容: 

你的老闆剛剛獲得了一卷磁帶,但與通常的磁帶不一樣的是,在這圈磁帶上有一些字符'o'和下劃線'_'。因爲你學過計算機和信息加解密,天然而然,解碼磁帶的這項任務就落到了你肩上。爲了幫助你解碼,下面會先給出一個解碼樣例: 解碼樣例: 
o____o_ 
oo__o_o 
oo_o__o 
oo_o_o_ 
oo_o__o 
oo_ooo_ 
oo__ooo 
_o_ooo_ 
上面的磁帶片斷解碼爲:Beijing. 
----------------------------------------------------------------------------------------------------------------- 

o_o_ooo 
oo_o___ 
oo__o_o 
ooo__o_ 
oo__o_o 
_o_____ 
ooo_o__ 
oo_o___ 
oo__o_o 
ooo__o_ 
oo__o_o 
_o_____ 
oo_o__o 
ooo__oo 
_o_____ 
oo____o 
_o_____ 
ooo_ooo 
oo_o__o 
oo_oo__ 
oo_oo__ 
_o_oo__ 
ooo_o__ 
oo_o___ 
oo__o_o 
ooo__o_ 
oo__o_o 
_o_____ 
oo_o__o 
ooo__oo 
_o_____ 
oo____o 
_o_____ 
ooo_ooo 
oo____o 
oooo__o 
_o_ooo_ 
那麼,如今該你解碼了...... 

key格式:simCTF{}
View Code

咱們發現,若是將第一段的o替換成1,_替換成0,能夠獲得如下字符,正好是解碼以後的結果Beijing對應的二進制ASCII碼

0100001

0011001

0101101

0010110

1010011

0100101

1011100

1100111

所以將第二段的字符替換成相應的0和1:

1010111
1101000
1100101
1110010
1100101
0100000
1110100
1101000
1100101
1110010
1100101
0100000
1101001
1110011
0100000
1100001
0100000
1110111
1101001
1101100
1101100
0101100
1110100
1101000
1100101
1110010
1100101
0100000
1101001
1110011
0100000
1100001
0100000
1110111
1100001
1111001
0101110
View Code

經過查詢ascii表獲得結果:

Where there is a will,there is a way.

 

10.想看正面?那就要看仔細了

題目類型:隱寫術

題目內容:看背影是否是很nice!想看正面?那就要看仔細了!

點擊連接後發現是一張圖片。

 

 

右鍵另存圖片,拖入winhex內進行分析,發現可疑的key

 

 提交字符串YmVhdXR5以後發現不是flag,猜想是進行了某種編碼加密,因而我進行了嘗試。

最後發現是通過了base64加密

通過解密獲得flag爲beauty。(可最後仍是沒有正面呀!)

 

11.無處不在的廣告

題目類型:隱寫術(預選賽隱寫術略多啊)

題目內容:此次他們決定把它藏起來,你能找到他麼?

點擊連接,是超人大戰蝙蝠俠

右鍵另存到本地,拖入winhex,並無發現任何線索。

既然是隱寫,可能這個廣告是做爲某個圖層寫入圖片了,因此仍然使用Stegsolve.jar對圖片進行分析。對圖像進行處理以後發現端倪,掃描二維碼獲得結果。

 

12.神祕字母

題目類型:密碼學

題目內容:在線代的課本上出現了一堆神祕字母 

dloguszijluswogany 

而旁邊的矩陣是 

1 2 
0 1 

快找出flag吧

根據密碼學的知識,矩陣每每出如今希爾密碼中,我決定使用希爾密碼進行嘗試。先將字母變換爲相應的數字:

dloguszijluswogany—>4,12,15,7,21,19,26,9,10,12,21,19,23,15,7,1,14,25

 對於希爾密文,咱們只須要作一次逆變換就能夠獲得明文。

 

根據公式計算獲得密碼逆矩陣爲

1  -2

0  1

 使用逆矩陣與密文相乘再mod26

 

(博客不支持word內公式編輯器,這裏我就用圖片代替好了)

將數字轉爲字符獲得flagishillissoeasy

 

完成後的感覺:

我以爲此次免考是一個學習的過程,在參加學校信安大賽的時候,題目相對簡單一些,但對於逆向相關的題目我也是直接放棄,沒有繼續深刻。藉此次機會,我瞭解了windows端逆向工具的操做,之後若是還有相似的機會面對CTF題的時候也許會更加從容吧。

(還有,終於不用寫博客了 捂臉.jpg)

相關文章
相關標籤/搜索