over 9 years ago
Reversing 200, PE 32bit 和一張加密過的 bmp 圖片
https://github.com/csie217/ctf/raw/master/boston-key-party-2014/decryptimg.zip
加密的過程在 cryptdll.dll,首先由 54 bytes 的原 key 生成加密用的 key' 和原/密文 xor,之後每 54 個 byte 重新生成 key 一次。重新生成 key 的過程差不多是 srand(hash) 然後 rand() 出 54 個值,基本上很難處理。但最一開始 54 byte 的生成是很簡單的
for( int i=1; i<54; i++ ){
key[i] = key[i-1]^key[i]^i;
}
我們可以猜測 BMP header 的樣子,xor 後可以直接解出原 key: key[i] = plain[i]^cipher[i]^i^plain[i-1]^cipher[i-1]
。BMP header 中除了長寬不確定外,其它的值大致上是固定的。因此我們可以枚舉可能的長寬 (width * height = (1440054-54)/3),然後看解出的圖片正不正確就行了。解出圖片 (800x600) 如下: