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. 设计模式(二十九)----综合应用-自定义Spring框架-Spring IOC相关接口分析

    1 BeanFactory解析 Spring中Bean的创建是典型的工厂模式,这一系列的Bean工厂,即IoC容器,为开发者管理对象之间的依赖关系提供了很多便利和基础服务,在Spring中有许多IoC ...

  2. vue 展开收起的过渡效果

    做的一个项目当中需要做一个组件,传入数组,用v-for生成表单,可以展开和收起,展开收起时需要有过渡的效果 在vue里面提供了<transtion></transtion>和& ...

  3. Java基础关于栈和堆的内存分配问题(转载)

    AVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方法区.3:方法区.4:栈.5:堆. 基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了. ...

  4. Java BIO,NIO,AIO

    一丶IO模型&Java IO Unix为程序员提供了以下5种基本的io模型: blocking io: 阻塞io nonblocking io: 非阻塞io I/O multiplexing: ...

  5. 二进制安装Kubernetes(k8s)IPv4/IPv6双栈 v1.24.0

    二进制安装Kubernetes(k8s) v1.24.0 IPv4/IPv6双栈 介绍 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 和 1.24 ...

  6. Rust中的into函数和from函数

    1.Rust中的into函数和from函数是做什么用的? into函数是Rust语言中的一个转换函数,它属于Into trait.它可以将一个类型转换为另一个类型.实现了From trait的类型会自 ...

  7. 【译】ConfigureAwait FAQ

    .NET 在数年前就在语言和库中添加了 async/await.在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制.在 .NET 中也看到了大量的改进, ...

  8. 使用Vue.js实现文字跑马灯效果

    实现文字跑马灯效果,首先用到 substring()截取 和 setInterval计时器 clearInterval()清除计时器 效果如下: 实现代码如下: <!DOCTYPE html&g ...

  9. 线上诊断神器-arthas基本应用

    Arthas基本应用 一.Arthas作用 什么是Arthas呢? ​ Arthas 是一款阿里推出的线上监控诊断产品,通过全局视角实时查看应用 load.内存.gc.线程的状态信息,并能在不修改应用 ...

  10. java Stack(栈)类、Queue和Deque队列

    1. java Stack类 特性是:LIFO(后进先出)先进后出,最先进入的在栈底. Stack底层也是通过数组实现的,同时也是线程安全的 Stack stack=new Stack(); //添加 ...