over 3 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) 如下:

← Boston Key Party CTF 2014 risc_emu BCTF 海報探秘 Writeup →