首届钓鱼城杯逆向题reg题解
首先下载程序,观察, 通过这个图标可以看出,感觉这个程序并不是普通的C/C++写的EXE程序,而是其他语言打包的
用IDA打开程序,果然,毫无头绪
用010editor打开程序,发现里面找到了关键字符串,然后居然是在资源段
用ResourceHacker打开reg.exe
发现,关键数据是在PRELOAD.MAIN里面,并且可以发现这个程序是用aardio写的,本来想反编译PRELOAD.MAIN来还原源代码来着,结果并没有找到相关aardio反编译的资料 (如果大佬知道怎么反编译的话,请评论留言,感谢!!)
结果只能放弃这种方法,观察PRELOAD.MAIN中的关键字符串,猜测是AES加密,
猜测它最终会调用底层的Win32API ,CryptEncrypt函数
这里先给出两个函数的参数
BOOL CryptEncrypt(
HCRYPTKEY hKey, //密钥句柄
HCRYPTHASH hHash, //
BOOL Final, //
DWORD dwFlags, //
BYTE *pbData, //存放要加密的数据
DWORD *pdwDataLen, //存放要加密的数据的长度
DWORD dwBufLen //pbData缓冲区总大小
);
// 加密后, pbData存放加密后的数据,然后pdwDataLen存放的是加密后数据的长度
BOOL CryptDecrypt(
HCRYPTKEY hKey, //密钥句柄
HCRYPTHASH hHash, //
BOOL Final, //
DWORD dwFlags, //
BYTE *pbData, //加密的数据
DWORD *pdwDataLen //存放要加密的数据长度
);
// 解密后, pbData存放解密后的数据,然后pdwDataLen存放的是解密后数据的长度
在加密的之前,其实还调用了很多其他的API来配置环境,因为那些都与解题无关,所以不再解释
具体的,大家可以参考这2篇文章
https://blog.csdn.net/kamaliang/article/details/6608786
https://www.cnblogs.com/M4ster/p/win_api_aes.html
我们用OD打开程序,在CryptEncrypt函数下断点
输入123
观察参数,pbData是咱们输入的数据,然后直接ctrl +F9,运行到函数末尾
发现数据已经加密完了,然后把数据提取出来,进行base64加密得到
import base64
a = b"\x33\x36\x38\xF1\x66\x54\x6C\xBC\x9C\x73\x02\xDE\x9D\x87\x5C\x2E"
c = base64.b64encode(a)
print(c) #MzY48WZUbLyccwLenYdcLg==
发现与程序输出的值一模一样
现在就很明确了,我们的思路就是手动patch改汇编来调用CryptDecrypt函数,关于它的参数,只需要改动 pbdata和pdwDataLen就可以了,于是我们把题目给出的
"8QAUFzIzw0gtrLeRUpesiVXTHsNtf+yNFFplxexMhAnJ3ejTeAlPHreByieTh1Gg"进行base64解密,得到
F1 00 14 17 32 33 C3 48 2D AC B7 91 52 97 AC 89
55 D3 1E C3 6D 7F EC 8D 14 5A 65 C5 EC 4C 84 09
C9 DD E8 D3 78 09 4F 1E B7 81 CA 27 93 87 51 A0
然后长度是0X30
进入OD,重新运行程序,还是在CryptEncrypt函数头部下断点,Ctrl + F9运行到末尾
这时,开始修改参数把 pbdata改为上述数据,然后pdwDataLen改为0X30
然后把ESP + 4
参数全部构造完毕
最后开始改汇编,直接改为call CryptDecrypt
F7进去,Ctrl + F9运行到函数末尾,再次观察参数
pbdata已经是解密后的数据了,双击过去,发现解密完成,得到了flag