1. 程式人生 > 實用技巧 >[WP]BUUCTF-Reverse-基礎題(1-12)

[WP]BUUCTF-Reverse-基礎題(1-12)

1、easyre

查詢基本資訊

載入 IDA

2、reverse1

核心部分就是將 Str2 中的 o 替換成了 0,再與 Str1(我們輸入的字串) 進行比對

查詢 Str2 的值

得到 flag

3、reverse2

與上題類似,也是將字元替換一下就能得到 flag

將 {hacking_for_fun} 中的 i 和 r 替換為 1 即可

4、內涵的軟體

執行程式

直接檢視字串

5、新年快樂

32 位程式,但有 UPX 殼

脫殼

載入 IDA 分析 main 函式

6、guessgame

載入 IDA,檢視字串即可

7、helloword

一道安卓逆向,利用 JEB 即可

8、xor

64 位程式

直接載入 IDA,將輸入的字串逐位異或後與 global 進行比對

查詢 global

寫出 EXP,執行得到 flag

 1 glo = [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, \
 2        0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, \
 3        0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, \
 4        0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, \
 5        0x4F]
 6 flag = ''
7 for i in range(len(glo)-1, 0, -1): 8 glo[i] ^= glo[i-1] 9 10 for i in glo: 11 flag += chr(i) 12 13 print(flag)

9、reverse3

修改棧指標後檢視 main 函式

查詢字串,其實看到這個字串表就可以大致知道是採用了 base64 加密或者是變種的 base64 加密

檢視 Str2 的值,為e3nifIH9b_C@n@dH

Dest 的值即為我們輸入的值,經過一個簡單的運算後與 Str2 進行對比

寫出 EXP ,執行得到 flag

1 import base64
2 a = 'e3nifIH9b_C@n@dH'
3 b = ''
4 for i in range(len(a)):
5     value = ord(a[i]) - i
6     b += chr(value)
7 print(b)
8 print(base64.b64decode(b).decode('utf-8'))

10、不一樣的 flag

32 位程式

載入 IDA 中,我們可以看到四個選項:上下左右,其實可以大致猜測這是一道迷宮題,# 即為終點

檢視字串,我們發現一個字串

寫出路徑即為 flag

11、SimpleRev

64 位程式

直接載入 IDA 檢視反編譯後的程式碼,進入主要的 Decry 函式。

最後進行比對的兩個變數為 text,str2。

根據流程可以編寫 EXP,執行得到 flag。需要注意一下是小端儲存,src、v10 需要反向後再進行拼接。

 1 #出現的變數
 2 key1 = 'ADSFK'
 3 key3 = 'kills'
 4 src = 'SLCDN'
 5 v10 = 'wodah'
 6 
 7 #LODWORD(v0) = join(key3, &v10)
 8 v0 = key3
 9 for i in range(len(v10)-1, -1, -1):
10     v0 += v10[i]
11 print(v0)
12 #strcat(key, src)
13 key = key1
14 for i in range(len(src)-1, -1, -1):
15     key += src[i]
16 
17 #第一個迴圈:key大寫轉化為小寫
18 tmp = ''
19 for i in key:
20     value = ord(i) + 32
21     tmp += chr(value)
22 key = tmp
23 
24 #第二個迴圈,逆向求出flag
25 str2 = text = v0
26 flag = ''
27 for i in range(len(str2)):
28     value1 = ord(str2[i])
29     value1 -= 97
30 
31     value2 = -ord(key[i])
32     value2 += 97
33     value2 -= 39
34     
35     value = value1 - value2
36     while True:
37         if value > ord('Z'): value -= 26
38         elif value < ord('A'): value += 26
39         else: break
40     flag += chr(value)
41 
42 print(flag)

12、Java逆向解密

將 class 檔案直接拖入 jd-gui 中,程式是將我們輸入的字串經過 Encrypt 中的第一個迴圈運算後,與 KEY 進行比對

需要注意到加法的優先順序比異或要高,寫出 EXP

1 key = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
2 for i in key:
3     value = i
4     value ^= 0x20
5     value -= 64
6     print(chr(value), end='')