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

随机推荐

  1. 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

    前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...

  2. 手机号码归属地 API 实现防止骚扰电话,看这一篇就够了(内附设计思路和代码)

     在当今时代,骚扰电话已经成为了很多人日常生活中的一个常见问题,严重影响了人们的工作和生活. 为了避免这种情况的发生,企业和机构可以采用手机号码归属地 API,以提供更好的电话服务,减少骚扰电话的出现 ...

  3. Unity3D中的Attribute详解(二)

    上一篇文章我们初步了解了一下Attributes的含义,并且使用系统自带的Attributes写了点代码.在进一步解剖我们的代码之前,我觉得有个概念可能需要巩固一下:什么是元数据? 我们知道C#代码会 ...

  4. Oracle安装及各种问题

    --hsql 1:jdk 本机位置:E:\Program Files\Java\jdk1.7.0_80\ 安装教程:复制然后配置环境变量 (1)新建->变量名"JAVA_HOME&qu ...

  5. vulnhub靶场之DRIFTINGBLUES: 5

    准备: 攻击机:虚拟机kali.本机win10. 靶机:DriftingBlues: 5,下载地址:https://download.vulnhub.com/driftingblues/driftin ...

  6. Java Stream流

    Java8 Stream流编程 Stream 使用一种类似于SQL语句从数据库查询数据的直观方式来提供对 Java 集合运算和表达的高阶抽象.得益于 Lambda 所带来的函数式编程,Stream A ...

  7. 使用vue-cli创建第一个vue项目

    命令提示符切换至需要创建项目的目录: 直接在路径输入cmd在按键盘的enter键打开的终端就直接切换到该目录下 (1)输入以下命令: vue create 项目名称 (2)我这里选手动选择,键盘上下按 ...

  8. JavaScript 发布-订阅设计模式实现 React EventBus(相当于vue的$Bus)非父子之间通信

    提前声明: 我没有对传入的参数进行及时判断而规避错误,仅仅对核心方法进行了实现: 解决了react的非父子间的通信: 参考文档:https://github1s.com/browserify/even ...

  9. [[SCOI2008]城堡] 解题报告

    [SCOI2008]城堡 最大值最小,显然二分答案,但考虑二分后如何 check. \(n\) 个点 \(n\) 条边,显然这是一个基环树森林.对于基环树,常用的套路是拆环为链,枚举删去哪条边.但这题 ...

  10. 2022-04-24:用go语言重写ffmpeg的muxing.c示例。

    2022-04-24:用go语言重写ffmpeg的muxing.c示例. 答案2022-04-24: 本程序的大体过程如下: 打开输出文件并写入头部信息. 添加音频和视频流,并为每个流创建 AVCod ...