1. 程式人生 > >CTF—逆向入門題目(超詳細)

CTF—逆向入門題目(超詳細)

以下為本人觀點結合其他write up總結出來的,如有錯誤請指出,謝謝

1.Bugkuctf平臺中的逆向題第一道easy_vb:

開啟檔案發現需要輸入註冊碼獲取flag

話不多說先放入PEID看看,養成這個好習慣,發現是用VB6寫的

我們載入IDA進行分析,用alt + t搜尋字串CTF,然後crtl + t搜尋下一個字串,直到看到flag

2.Bugkuctf平臺中的逆向題第二道Easy_Re:

先把檔案下載下來載入PEID

執行檔案發現有字串flag,於是考慮用IDA開啟檔案查詢字串flag

來到這裡發現xmmword後面有兩串奇怪的字串,我們將其選中按R鍵將其變成字串發現flag

3.南郵CTF逆向題第一道Hello,RE!

下載檔案用PEID載入,無殼,執行一下發現讓輸入flag,老辦法用IDA開啟查詢字串flag

查詢到之後用f5檢視虛擬碼

看到如下結果,將v5~v11的結果用R改為字串得到flag

4.實驗吧 Just Click

下載檔案用exeinfo這款軟體檢視發現程式用C#撰寫

開啟軟體發現需要點選相應的數字才能發現flag

因為是用C#寫的所以我們考慮用Reflector軟體將其開啟

找到MainWindow發現類似主函式的東西,分析發現需要按順序點選8次就能出現flag

按這個順序點選即出現flag。

5.南郵CTF py交易

下載檔案發現是pyc格式,我們直接在網上找線上反編譯python的網站:https://tool.lu/pyc/

反編譯後發現是這樣的

分析演算法:首先輸入一段字串,進入encode函式之後與字串correct進行比較

encode函式就是將輸入的字串中每個字元ascii都與32進行異或運算,然後每個在加上16得到新的字串,最後再將這個字元

串進行base64加密。

所以我們只需將"XlNkVmtUI1MgXWBZXCFeKY+AaXNt"進行base64解密,再將每個字元ascii碼都減16,接著與32異或即可得

到flag

python程式碼如下:

import base64
 
correct ='XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
 
s = base64.b64decode(correct)
 
flag =''
 
for i in s:
 
i = chr((ord(i)-16)^32)
 
flag += i
 
print flag

執行即可得到flag:nctf{d3c0mpil1n9_PyC}

6.Jarvis OJ :FindKey

下載檔案發現是一個很複雜的東西

用一款叫做斯托夫檔案格式分析器分析一下這個軟體的型別

發現是python寫的,將其後綴名改為.pyc然後放入線上反編譯網站裡得到如下

import sys

lookup = [
196,153, 149,206, 17,221, 10, 217, 167, 18, 36, 135, 103, 61, 111, 31, 92, 152, 21, 228, 105, 191, 173, 41, 2, 245, 23, 144, 1, 246, 89, 178, 182, 119, 38, 85, 48, 226, 165, 241, 166, 214, 71, 90, 151, 3, 109, 169, 150, 224, 69, 156, 158, 57, 181, 29, 200, 37, 51, 252, 227, 93, 65, 82, 66, 80, 170, 77, 49, 177, 81, 94, 202, 107, 25, 73, 148, 98, 129, 231, 212, 14, 84, 121, 174, 171, 64, 180, 233, 74, 140, 242, 75, 104, 253, 44, 39, 87, 86, 27, 68, 22, 55, 76, 35, 248, 96, 5, 56, 20, 161, 213, 238, 220, 72, 100, 247, 8, 63, 249, 145, 243, 155, 222, 122, 32, 43, 186, 0, 102, 216, 126, 15, 42, 115, 138, 240, 147, 229, 204, 117, 223, 141, 159, 131, 232, 124, 254, 60, 116, 46, 113, 79, 16, 128, 6, 251, 40, 205, 137, 199, 83, 54, 188, 19, 184, 201, 110, 255, 26, 91, 211, 132, 160, 168, 154, 185, 183, 244, 78, 33, 123, 28, 59, 12, 210, 218, 47, 163, 215, 209, 108, 235, 237, 118, 101, 24, 234, 106, 143, 88, 9, 136, 95, 30, 193, 176, 225, 198, 197, 194, 239, 134, 162, 192, 11, 70, 58, 187, 50, 67, 236, 230, 13, 99, 190, 208, 207, 7, 53, 219, 203, 62, 114, 127, 125, 164, 179, 175, 112, 172, 250, 133, 130, 52, 189, 97, 146, 34, 157, 120, 195, 45, 4, 142, 139]

pwda = [188, 155, 11, 58, 251, 208, 204, 202, 150, 120, 206, 237, 114, 92, 126, 6, 42]

pwdb = [53, 222, 230, 35, 67, 248, 226, 216, 17, 209, 32, 2, 181, 200, 171, 60, 108]

flag = raw_input('Input your Key:').strip()

if len(flag) != 17:
    print 'Wrong Key!!'
    sys.exit(1)

flag = flag[::-1]

for i in range(0, len(flag)):
    if ord(flag[i]) + pwda[i] & 255 != lookup[i + pwdb[i]]:
        print 'Wrong Key!!'
        sys.exit(1)

print 'Congratulations!!'

下面寫個指令碼就ok了

import sys

lookup = [
196,153, 149,206, 17,221, 10, 217, 167, 18, 36, 135, 103, 61, 111, 31, 92, 152, 21, 228, 105, 191, 173, 41, 2, 245, 23, 144, 1, 246, 89, 178, 182, 119, 38, 85, 48, 226, 165, 241, 166, 214, 71, 90, 151, 3, 109, 169, 150, 224, 69, 156, 158, 57, 181, 29, 200, 37, 51, 252, 227, 93, 65, 82, 66, 80, 170, 77, 49, 177, 81, 94, 202, 107, 25, 73, 148, 98, 129, 231, 212, 14, 84, 121, 174, 171, 64, 180, 233, 74, 140, 242, 75, 104, 253, 44, 39, 87, 86, 27, 68, 22, 55, 76, 35, 248, 96, 5, 56, 20, 161, 213, 238, 220, 72, 100, 247, 8, 63, 249, 145, 243, 155, 222, 122, 32, 43, 186, 0, 102, 216, 126, 15, 42, 115, 138, 240, 147, 229, 204, 117, 223, 141, 159, 131, 232, 124, 254, 60, 116, 46, 113, 79, 16, 128, 6, 251, 40, 205, 137, 199, 83, 54, 188, 19, 184, 201, 110, 255, 26, 91, 211, 132, 160, 168, 154, 185, 183, 244, 78, 33, 123, 28, 59, 12, 210, 218, 47, 163, 215, 209, 108, 235, 237, 118, 101, 24, 234, 106, 143, 88, 9, 136, 95, 30, 193, 176, 225, 198, 197, 194, 239, 134, 162, 192, 11, 70, 58, 187, 50, 67, 236, 230, 13, 99, 190, 208, 207, 7, 53, 219, 203, 62, 114, 127, 125, 164, 179, 175, 112, 172, 250, 133, 130, 52, 189, 97, 146, 34, 157, 120, 195, 45, 4, 142, 139]

pwda = [188, 155, 11, 58, 251, 208, 204, 202, 150, 120, 206, 237, 114, 92, 126, 6, 42]

pwdb = [53, 222, 230, 35, 67, 248, 226, 216, 17, 209, 32, 2, 181, 200, 171, 60, 108]

flag = ''

for i in range(0,17):  //這裡就是要滿足wrong key的條件才能得到正確的flag

  flag+=chr(lookup[i + pwdb[i]]-pwda[i] & 255)  

flag=flag[::-1]

print flag

執行一下就得到flag了

7.Jarvis OJ :stheasy

拿到題目下載了一個很複雜的檔案,我們先放入斯托夫檔案格式分析器分析,發現:

我們用IDA將其開啟,很容易找到關鍵函式位置:

按下F5編譯一下,獲得如下函式:

有一個sub_8048630函式決定了Flag的對錯,所以我們只需要研究一下它:

這裡我為了便於觀察重新命名了a,b函式,我們雙擊a和b查詢一下他們具體的值,將a這兩排選中用shift + E快捷鍵選擇第四個選項,用陣列表示a如下,b同理:

研究完演算法之後就可以寫指令碼了:

a = [
  0x48, 0x5D, 0x8D, 0x24, 0x84, 0x27, 0x99, 0x9F, 0x54, 0x18, 
  0x1E, 0x69, 0x7E, 0x33, 0x15, 0x72, 0x8D, 0x33, 0x24, 0x63, 
  0x21, 0x54, 0x0C, 0x78, 0x78, 0x78, 0x78, 0x78, 0x1B
     ]

b = [
  0x6C, 0x6B, 0x32, 0x6A, 0x39, 0x47, 0x68, 0x7D, 0x41, 0x67, 
  0x66, 0x59, 0x34, 0x64, 0x73, 0x2D, 0x61, 0x36, 0x51, 0x57, 
  0x31, 0x23, 0x6B, 0x35, 0x45, 0x52, 0x5F, 0x54, 0x5B, 0x63, 
  0x76, 0x4C, 0x62, 0x56, 0x37, 0x6E, 0x4F, 0x6D, 0x33, 0x5A, 
  0x65, 0x58, 0x7B, 0x43, 0x4D, 0x74, 0x38, 0x53, 0x5A, 0x6F, 
  0x5D, 0x55, 0x00
     ]

flag = ''

c = []

for i in range(0,len(a)):
    c.append(a[i]/3-2)    //append() 方法用於在列表末尾新增新的物件
    c[i] = int(c[i])      //將資料轉換為整形,不轉換會出錯
for j in range(0,len(a)):
    flag += chr(b[c[j]])
print(flag)
    

最後執行得到Flag:

最後說一句,這是我的部落格,以後就跟新在部落格裡面啦,歡迎大家參觀,裡面有很多我學習的資料哦