吾爱论坛2023春节出的题,此道题是Android中级题。
使用jadx查看程序流程:
由于write_img()
当分贝符合时才执行,所以先hookCheck_Volume()
修改其分贝值。
查看write_img()
函数:
私有目录即/sdcard/Android/data/{PackageName}/files/
,其实私有目录下的aes.png
与/assets/
中的aes.png
是一样的。查看aes.png
文件,发现进行了Base64编码。
Java层逻辑已经分析了差不多了,并没有调用到Native层方法,但加载了So文件。查看lib52pj.so
的导出函数,有AES加解密函数、Base64加解密函数以及Key,结合aes.png
,基本上可以判断aes.png
进行了AES加密,然后再进行Base64编码。
接下来就是找密钥。查看JNI_OnLoad()
方法,JNI_OnLoad()
中执行了ptrace()
方法,所以如果我们使用Frida再次ptrace()
会失败。
进入methods,找到注册函数get_RealKey()
,传入的字符串长度为16,与内存数据加密后与“thisiskey”作比较,如果相等返回false,这里是个障眼法,我一直以为是相等返回true!
那么这个传入的字符串是什么呢?这个应用并没有要求我们输入,所以这个字符串应该是本地存储的。猜测是通过假密钥得到真密钥。查看导出函数表的encrypt()
与decrypt()
函数,它们使用的密钥为|wfkuqokj4548366
,这个应该就是假密钥。
vaddq_s8()
函数表示一次性对16个数进行加法,刚好假密钥与内存数据都是16个字符。对其进行加密得到真密钥wuaipojie2023114
。
已知真密钥,再对aes.png
进行AES解密。CyberChef也太香了。
1 | flag{Happy_New_Year_Wuaipojie2023} |