2017年SWPU的一道逆向題,先前很少接觸逆向里的密碼算法題等脂,ida f5反編譯的結(jié)果一開始也覺得無從下手不知道是什么算法,google搜索一些常數(shù)或者ida里的宏定義ROL4之類的,效果也很差叔营。revers
之前ida裝過一個(gè)find crypto撑刺,幾次要么無法識(shí)別鹉胖,要么識(shí)別不準(zhǔn),后來發(fā)現(xiàn)peid的一個(gè)插件Kcrypto ANALyzer很好用够傍。
再回到DES算法甫菠,對(duì)稱密碼接觸不多,下意識(shí)的以為對(duì)稱密碼的解密過程就是加密過程的逆運(yùn)算冕屯,也找到了github上一個(gè)des算法(crypto++庫的)寂诱,整了半天沒搞明白怎么解密。后來看了wp才知道安聘,des有一個(gè)非常有用的性質(zhì)痰洒,加密和解密使用相同的算法!DES加密和解密唯一的不同是密鑰的次序相反浴韭。
import os
f = open("./CM300.exe","rb").read()
head = f[:0x1A0108]
key_tables = f[0x1A0108:0x1A0188]
tail = f[0x1A0188:]
limedi = []
for i in range(0, len(key_tables), 4):
limedi.append(key_tables[i:i+4])
#交換密鑰
for i in range(0, 16, 2):
temp = limedi[i]
limedi[i] = limedi[32-2-i]
limedi[32-2-i] = temp
temp = limedi[i+1]
limedi[i+1] = limedi[32-1-i]
limedi[32-1-i] = temp
medi = ""
for i in limedi:
medi += i
f = open("./CM300decrypt.exe", "wb")
f.write(head)
f.write(medi)
f.write(tail)
f.close()