先来看看APP界面

image.png

拖到jadx,see see java 源码

image.png

关键是要让代码跳转到这里,我这里主要是修改smali,然后重新签名打包,当然,你也可以用frida或者objection hook 传参

image.png

模仿下面的两行代码,在位置1插入

1
2
:cond_63
:goto_63

然后,修改上面的两个if判断,重新打包,跳转成功

image.png

过了这个,但还是啥都没有,只跳出一句话,再看源码,注意到两处可疑的地方

image.png

image.png

将apk改成压缩包,在里面找到 aes.pnglib52pj.so 两个文件

先以文本形式打开 aes.png,得到一大段意义不明的文本

image.png

有点像是base64编码,decode一下

image.png

还是不明所以,先放一边……💀💀💀

再来分析so,拖到 IDA Pro 分析

image.png

进入 Java_com_zj_wuaipojie2023_12_MainActivity_decrypt 函数内部

image.png

image.png

这里可以确定加密算法是AES,模式是ECB,填充是PKCS7,|wfkuqokj4548366 刚好16位长度,疑似密钥

到**CyberChef**试试就知道了,显示参数出错,果然没那么简单 😥

image.png

到这里没什么头绪,看沐阳大佬说可以用unidbg下断点,但我一直找不到那个点,逛论坛发现有佬get_RealKey扣了出来(好吧,我是菜🐶 )

1
2
3
4
5
6
7
int main() {
char key[] = "|wfkuqokj4548366";
char add_mask[] = { 0xFB, 0xFE };
for (int i = 0; i < sizeof(key) - 1; i ++)
key[i] += add_mask[i & 1];
printf("key = '%s'\n", key);
}

运行拿到真实的key wuaipojie2023114

image.png

拿到 cyber 上面,再增加一个 From Hex,得到结果如下:

image.png

把结果保存成图片,得到表情包一枚 😂

image.png

按理说flag应该就藏在这张图里面了,Cyber 再加一个 To Hexdump,观察到有两个PNG的标志

image.png

也就是上面那张表情包,其实是两张图片拼凑而成,大佬们推荐的是用 010editor 拆分图片,我没用过这软件,也懒得去下 😂

仔细想想,图片就是二进制数据,也就是 byte,能不能用python来拆呢?答案是肯定的

1
data = open("download.png", "rb").read()

先获取字节,然后观察到有两个 \x89PNG

image.png

拿第二个PNG,因为第一个其实就是上面那张表情包,第二个才是隐藏的图片,相当于被覆盖了

1
\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\x00\x00\x00d\x08\x06\x00\x00\x00p\xe2\x95T\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x03\x8cIDATx\x9c\xed\x9c\xdbn\xc30\x0cC\x9ba\xff\xff\xcb\xddS\x80\xcd\xa8JQ\x92\x1b"\xe3y[\x93\xd8.d\xce\xba5\xc7\xf3\xf9|>\x8c\x0c_W/\xc0\xfc\xc5\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xe3\xbb\xf2\xd0q\x1c\xa5\xc9\xd6<\xe69\x0e\xcao\xa2\xf9\xce\xe7\xd7\xfb\xb2\xe3\xa2uM}\xdf\x0cV\x88\x18%\x85\x9cdw\xc0\xba\xc3\xd0\x0e\x8c\xc6\x8d>G;=\x82\x9d\xa7\xfa}\x19\xac\x101Z\n9\x89v\x04\xdaih\'E\xd7\x91\xa2\xb2\xeb\xc9\x9ea\xd9uM\xd4\xfa\xac\x101F\x14R\x05\x9d\t\xd9\xe7\xa3\x9d\x8e\x94\x88\x94uEu\xdb\n\x11\xe3R\x85\xb0;7\xf2\xd6\x10YoN\xa1\xdf\xc3\n\x11cD!U/\xa5\x1a7DqLVAl<\x93}~\x02+D\x8c\x96B:\x11\xe9\xabq\x90\xd7\x84@\n\xaa\xfe\xbd\xaes\'V\x88\x18%\x85L\xfd\x0fe\xb3\xaa\xdd\xackU\x19\x9f\xf4\xbe\xac\x101\xb6\xc4!\xd5,\xebz\x1d)(\xab\xb0\xec}\xd9y\xbb^\xda;\xac\x101Z\x15\xc3\xe9\n`u\x87f\xe3\x92h\x9e\xf5\xf9n=\xa4\x83\x15"\xc61\xf9\x83\x1d\xd6\x7f\xcfzW\xac\xe2X\xaf\xaa:\xdf\x0e\xc5X!b\x8c(\x84\x8dt\xab\x111;>Zgt\xbd\x8a+\x867d\xcb\x19r\xc2F\xc4\xd1x\xec}S5\xf7\xec\xf8\x11\xee\xcb\xba\x01\xa3\x9d\x8b\xbb:\x00\xa3\xf9\xb3\xf1\xc2\x94\x17\xb6\xfb\x0cz<\xac\x109F:\x17Qd\xcc~>\xe5%e\xb3\xb6\xec\x19\xb7\xb3;\xc5\n\x11c\xb4\x1e\x82\xbc\x9cj\x165\x02\xcd\xc3\x9e5\xd1\xe7\xec<\xee\xed\xbd\x11\xad8d\xeaw\x1b\xdd\xec/\x9a\x7f\x9d\'\xab\xe4\xeez\x1c\x87\xdc\x80\x91z\x08\xaaGT\xe3\x02\x96\xee\xfc\xeczvt\xa7X!b\x94\xce\x90\xe9\\Q\x95\xe9\x9cTv}S}d\xaf\xb0B\xc4\xd8\x9a\xed=\x99\xea\x08\xac\xc6)\xd5\x9d\xbf~\x8e\xd61\x11\xc1[!b\x8c\xc4!\xd5.\x93\x93\xa9\xec\xe9\xae\xca\xe3\xce\xfa\xc7\x8a\x15"\xc6\xe8\xef\xd4\xab^O\xf4\xbfwz\xe7f\xb3\xd2l\x8e\xcb\xd9\xde\x1b3R1\xccf\x7f\xab\xf5\x86\xea\xfc\xd9\xf5D\xe3\xb0\xdd-\xee\xed\xbd!\x1f\xc9\xf6f\xefg\x9fc\x15\xd8\xdd\xd9\xdd~\xb3\x0cV\x88\x18[\xdf\x06\xd4\xcd\xeaf\xbb@\xd0\xba\xd8\x9a>\xba\xcf5\xf5\x7f\xc4h=\xe4\x04\xd5\x17\xb2d\xeb\x14\xa8\xfe\xc1\xe6\xa6\xaa\xf5\x0c{Y7dk\xd7\t[\xbb\xae\xee\xe4\xee\x0e\xcf*\x0ba/\xeb\x86l\xfd\x05\xd5t\x1fVv\xfe\x95n|\xb2\x8e\xb3\x13+D\x8c\xad\xb9\xac\xf5\xfe\xa9\x9a5{Fe\xb3\xc4l\x0e-\x9ao\xfd\x9c\xc1\n\x11c\x8b\x97\x85\xeecw\x12\x9b\xa5\x9d\x82\xcdFW\xe3\xad\xdfX!b\\\xfa\xee\xf7h\xbcl\x9c\x83\xae\xb3\xf1\t\xca\x99M\x9f\x95\xaf\xb0B\xc4\xb8\xe4\xdd\xef\xd18\xd9\xacj\xf5\xcc\xa9V(\xa7+\xa2\xef\xb0B\xc4\xb8\xe4\xdd\xef\xd5\xebl\xd7\tR\x04:c\xaa9\xb1\x0eV\x88\x18\x97\xbc\xd9\xba\x1a\xb1O\xf5\xf6\xb2Y\xe8\xe8z\xb5O\xec\x1dV\x88\x18\x12\xef~_\x15\xc0z)\xdd\xfe(6\xeeA\x9d\x90\x8eCn\xc4%\xef~_\x9f\xfbt\x8d\x1b\xc5\r\xd5\x8e\xc6\xec\xf5wX!b\\\xfa\xee\xf7\xae\x97\x92\xf5\x8a\xd6\xf9\xd0z\xd0|\xecs\x0cV\x88\x18\xa35u\xd3\xc7\n\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xc3\x06\x11\xe3\x07\x00\xbc\xbf\xd9\x88\x91.k\x00\x00\x00\x00IEND\xaeB`\x82

另存到一张图片

1
2
with open("code2.png", "wb") as p:
p.write(png_1)

结果是一张二维码,扫码就能得到 flag{Happy_New_Year_Wuaipojie2023} 了

image.png

第一次玩这种比较有难度的CTF,感觉这玩意太考经验和综合能力了 🤐🤐🤐