bugku_MagicImageViewer
CTF 安卓逆向
MagicImageViewer——png结构+算法
很少做安卓逆向的题目,在此记录一下
先用模拟器看一下

嗯,没啥提示。
jeb打开

关键部分
if(s.length() == 16) //输入的字符串长度为16
String s1 = MainActivity.this.getKey(s); //该方法获得s1,getKey()在native层
Bitmap bitmap0 = MagicImageUtils.readMagicImage(MainActivity.this, "png/encrypt_png.dat", s1);
// MagicImageUtils.readMagicImage是Java层的方法
先看getKey()

关键部分
strcpy(v5, "Welcome_to_sdnisc_2018_By.Zero");
v13[i] = *(v7 + 2 * i) ^ v5[i - 30 * (v9 / 30)];
2*i比较怪,是什么呢?我们查一下JNI的GetStringChars方法,由参考链接1可知它返回的是Unicode格式的char*,所以2字节算一个字符**
v5[i - 30 * (v9 / 30)这个就是v5[i]
就是对输入的字符串进行异或(前16位)
接着看MagicImageUtils.readMagicImage

关键部分
int v1 = inputStream0.read();//读取路径文件
arrayList0.add(Byte.valueOf(((byte)MagicImageUtils.decrypt(v1, ((char)s1.charAt(v % 16))))));
//decrypt() 在native层

也是个异或
接着往下看可以发现,后面生成了图片,也就是对于加密后的图片数据,解密为图片
输入s,s与v5异或得到s1,s1,路径文件异或生成内容转化,图片。
但是png图片的前16位是固定的,所以很容易解出来。
goal = b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52' //png图片的前16 位
key_s = 'Welcome_to_sdnisc_2018_By.Zero'
ans = ''
with open('encrypt_png.dat', 'rb') as f:
dat = f.read(16)
for i in range(16):
v = (dat[i] - 1) ^ 0x61 ^ goal[i] ^ ord(key_s[i])
ans += chr(v)
print(ans)
输出 XaE3*2#@!qV^v+_.
验证:

得到flag。
此时可以更为有趣的写出png(刚开始没想到)
此时
没看懂getKey也能过这题。
作者贴心地提供了一个正常图片的处理函数MagicImageUtils.readImage。
此时会出现dat=0的情况,所以加了验证
goal = b'\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52'
def b(v):
return v if v >= 0 else 0xff
with open('encrypt_png.dat', 'rb') as f:
dat = f.read()
_key = b''
for i in range(16):
_key += (b(dat[i] - 1) ^ 0x61 ^ goal[i]).to_bytes(length=1, byteorder='big', signed=False)
with open('flag.png', 'wb') as f:
for i in range(len(dat)):
f.write((b(dat[i] - 1) ^ 0x61 ^ _key[i & 0xf]).to_bytes(length=1, byteorder='big', signed=False))

flag{y0ur'r3_g00d_aT_4ndr01d}
参考链接:
https://www.cnblogs.com/lijunamneg/archive/2012/12/22/2828891.html
https://www.52pojie.cn//thread-1665541-1-1.html
随机推荐
- MyBatisPlus 实战字典
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具包,只做增强不做改变,为简化开发工作.提高生产效率而生. 一.Service CRUD 接口 [说明]:[1]通用 Servic ...
- Nacos 服务发现
更多内容,前往 IT-BLOG 一.Nacos 简介 Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现.配置管理.服务治理的综合型解决方案.Nacos 使服务更容易注册,并通过 DNS ...
- jQuery绑定方法
流程/*** * 1.文件命名 * jquery.banner.1.0.0.js * jquery.banner.js * 2.添加匿名函数 * (function(){})() * 3.给插件前后添 ...
- 痞子衡嵌入式:恩智浦经典LPC系列MCU内部Flash IAP驱动入门
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦经典LPC系列MCU内部Flash IAP驱动. LPC 系列 MCU 是恩智浦公司于 2003 年开始推出的非常具有代表性的产品 ...
- Wikijs简介-强大&可扩展的开源维基软件
Wikijs - 最强大 最可扩展的开源维基软件 使用 wiki.js 美丽直观的界面,让文档成为写作的乐趣! 优点 随时随地安装 几乎适用于任何平台,并与PostgreSQL.MySQL.Maria ...
- 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版
二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 --- Ubuntu版本 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安 ...
- [人生感悟]做人、做事的"人生十悟"【转载】
做人.做事.做官,是不少人需要经常面对和正确把握的大问题,处理好了,则健康成长,反之则裹足不前,甚至掉入人生的一个个"陷阱",这其中有规律可循,总结"十悟"可思 ...
- [网络]内网IP的判别与分类
1 内网IP划分 内网IP地址分为A类.B类和C类,其地址范围如下: A类地址: 10.0.0.0 - 10.255.255.255 B类地址: 172.16.0.0 - 172.31.255.255 ...
- 机器学习(五):混合高斯聚类(求聚类标签)+PCA降维(3维降2维)习题
使用混合高斯模型 GMM,计算如下数据点的聚类过程: \(Data = np.array([1,2,6,7])\) 均值初值为: \(\mu_1, \mu_2 = 1, 5\) 权重初值为: \(w_ ...
- day117:MoFang:宠物栏的功能实现&宠物道具的使用
目录 1.宠物栏的功能实现 2.宠物道具的使用 1.宠物栏的功能实现 1. 宠物的显示 2. 宠物的使用 3. 宠物的饱食度 4. 宠物的开锁 1.服务端提供显示宠物的api接口 orchard/so ...