SimpleRev
SimpleRev
拖入 ida 64,程序并不復雜,直接 F5 反編譯就看到主要的流程
發現主要的處理是在 Decry() 函數中,直接點進去,如下圖(圖1)
為了便于理解,轉換了一部分之后如下圖(圖2),接下來進行分析
可以看到主要操作如下:
(1)將字符串 key3 和變量 v9 進行 join() 操作,賦值給變量 text,其中 key3 的值為 kills,點進去 join() 函數發現實質也是 strcpy() 加上 strcat() 的使用
(2)將 key1 的值復制給 key,再使用 strcat() 將變量 src 的值和 key 進行連接,其中 key1 的值為 ADSFK
strcat() 函數原型:
char *strcat( char * destination, const char * source );
作用:
把 strSource 所指向的字符串追加到 strDestination 所指向的字符串的結尾。strDestination 末尾的 \0會被覆蓋,strSource 末尾的 \0會一起被復制過去,最終的字符串只有一個 \0。
阿斯克碼表
(3)for 循環,對 key 進行處理,將 key 中的大寫字母都轉換成小寫字母
(4)while 循環,對輸入的字符進行處理,具體是將字符依次讀到變量 v1 中,然后判斷是否是大寫字符或者小寫字符,但是處理操作都一樣,都是 str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97;,一系列操作之后依次賦值給變量 str2
(5)最后將變量 text 和 str2 進行對比,一致的話輸出 Congratulation!
注意:在圖二中看到的變量 src 和變量 v9,分別是 SLCDN和 wodah,但是其實有一定的坑。
個人理解是,在圖一中,可以看到變量 src 和變量 v9,都是 int64 數據類型。我們用 ida 時候,ida 給我們顯示的是大端序,但其實 int64 數據類型存儲時候是按照小端序的,因此進行字符串拼接操作也需要按照小端序進行。
因此變量 src 和變量 v9,實質上分別是 NDCLS和 hadow,拼接得到的變量 key 為 ADSFKNDCLS,變量 text 為 killshadow
因為涉及到 %26 的運算,為了方便我們直接進行爆破,遍歷字母 a - z,經過加密后的值與 text 對比,最終求得原來的輸入的值
key = 'ADSFKNDCLS' text = 'killshadow' key_new = '' for i in range(0, len(key)): # 將 key 轉換成小寫key_new += chr(ord(key[i]) + 32) flag = '' for i in range(10):for j in range(65, 123):if j > 90 and j < 97:continueelse: # 遍歷 A-Z 和 a-zif chr((j - 39 - ord(key_new[i]) + 97) % 26 + 97) == text[i]:flag += chr(j)break print(flag)理論上這個腳本最后的 break 是不需要的,因為 flag 有 10 位,其中原來的程序對于每一位的操作,都是不區分大小寫的,就是說每一位都有大寫和小寫兩種答案,即總共有 2^10 個答案。這里使用 break 之后,每個位置就是全都是大寫的
總結
- 上一篇: UG NX 12 草图曲线
- 下一篇: java8判断当前时间是否大于某个时间