安卓刷java_安卓逆向刷题(攻防世界)

easyapk

第一步一般都是先查壳(不过这种刚刚入门的题目基本上都是没壳的啦🤣)

64599fa098451e3ddbb04f636bfb348b.png

然后先运行一下看看是个啥...

f090591fd6b932a9b4b6e699cc000b61.png

这个框是输入不了的。

拖到jeb或者jadx里面瞅瞅,这个界面就一个很明显的MainActivity,也不用adb dump当前活动了

3370000ffbc44ad7f6ab0e2a2ea39bae.png

很明显,就是获取text View文本框的内容,进行base64加密然后跟“5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs=”比较即可,那整体思路就是对这个字符串进行解密即可。

但是注意到

a94ec4ac38d6d5a07c2d010ca201e0ac.png

这个base64是被重写过的。

package com.testjava.jack.pingan1;

public class Base64New {

private static final char[] Base64ByteToStr = {'v', 'w', 'x', 'r', 's', 't', 'u', 'o', 'p', 'q', '3', '4', '5', '6', '7', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'y', 'z', '0', '1', '2', 'P', 'Q', 'R', 'S', 'T', 'K', 'L', 'M', 'N', 'O', 'Z', 'a', 'b', 'c', 'd', 'U', 'V', 'W', 'X', 'Y', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', '8', '9', '+', '/'};

private static final int RANGE = 255;

private static byte[] StrToBase64Byte = new byte[128];

public String Base64Encode(byte[] bytes) {

StringBuilder res = new StringBuilder();

for (int i = 0; i <= bytes.length - 1; i += 3) {

byte[] enBytes = new byte[4];

byte tmp = 0;

for (int k = 0; k <= 2; k++) {

if (i + k <= bytes.length - 1) {

enBytes[k] = (byte) (((bytes[i + k] & 255) >>> ((k * 2) + 2)) | tmp);

tmp = (byte) ((((bytes[i + k] & 255) << (((2 - k) * 2) + 2)) & 255) >>> 2);

} else {

enBytes[k] = tmp;

tmp = 64;

}

}

enBytes[3] = tmp;

for (int k2 = 0; k2 <= 3; k2++) {

if (enBytes[k2] <= 63) {

res.append(Base64ByteToStr[enBytes[k2]]);

} else {

res.append('=');

}

}

}

return res.toString();

}

}

这题主要学到了Base64编码原理:

1、将字符串转为字节数组,然后每3个字节一组,一个24个比特,不足3个字节直接补0

2、在每一组3个字节24bit中,以6个bit构成一个字节(高两位补0),形成4个字节为一组

3、根据编码后的字节查找对照表,拼接成字符串,自此,Base64编码完成!!!

以及Base64解码原理:

1、将编码后的字符串查找对照表后的字节以4个字节为一组,出现=直接去掉即可

2、将这4个字节每个字节的高两位去掉,有32bit变为24bit,将这24bit以8个bit构成三个字节

3、将第二步得到的字节数组转为字符串即

exp.py:

def Base64Decode(str_list):

list_base = []

a = str_list[0] << 2

c = str_list[1] & 15

b = str_list[1] >> 4

a = a | b

list_base.append(a)

c = c << 4

a = str_list[2] & 3

b = str_list[2] >> 2

c = c | b

list_base.append(c)

a = a << 6

a = a | str_list[3]

list_base.append(a)

return list_base

CodingTable = 'vwxrstuopq34567ABCDEFGHIJyz012PQRSTKLMNOZabcdUVWXYefghijklmn89+/'

Ciphertext = '5rFf7E2K6rqN7Hpiyush7E6S5fJg6rsi5NBf6NGT5rs='

i = 0

flag = 'flag{'

while i <= (len(Ciphertext) - 1):

list1 = []

n = 0

for k in range(4):

if Ciphertext[i + k] == '=':

list1.append(0)

n = n + 1

else:

list1.append(CodingTable.index(Ciphertext[i + k]))

ba = Base64Decode(list1)

for j in range(3 - n):

ch = chr(ba[j])

flag = flag + str(ch)

i = i + 4

flag = flag + '}'

print(flag)

运行截图:

48726f8aa14cc321c6fd8014ad1cc8ac.png

easyjava

看到只有java层就知道这题不会很难...

58b9e3efeec362a3e31f1310bad5ebc0.png

看到关键在这一句:MainActivity.m3253b(((EditText) ((MainActivity) this).findViewById(R.id.edit)).getText().toString()).booleanValue()

然后去找m3253b方法:

afcbbf54db5c200f3af06299f34774a4.png

public String substring(int beginIndex, int endIndex)

然后关键就是里面的算法分析了。

c1108f698fa051e75b371eb8b8819e8c.png

9be1c51a61ad7ac9c99cc9f8c21a64ec.png

接着再来看a类中的a(int)函数,该函数首先获取与传进来的参数相等的数组中的值的索引,然后获取在字符串中索引为该数组索引的字符,最后返回该字符,当然,其中也调用a()函数,但是该函数要求等于25,所以该函数木有任何作用。

所以后面步骤基本上就是:

遍历输入的字符串

字符串(结果)+=a的普通方法a(b的普通方法b(遍历到的输入的字符串元素+“”)))

基本上大概分析差不多了,然后编写exp

from collections import deque#双端队列

alpha = deque("abcdefghijklmnopqrstuvwxyz")

t1 = deque([8, 25, 17, 23, 7, 22, 1, 16, 6, 9, 21, 0, 15, 5, 10, 18, 2, 24, 4, 11, 3, 14, 19, 12, 20, 13])

t2 = deque([7, 14, 16, 21, 4, 24, 25, 20, 5, 15, 9, 17, 6, 13, 3, 18, 12, 10, 19, 0, 22, 2, 11, 23, 1, 8])

ss = 'wigwrkaugala'

for _ in range(2):

t1.append(t1.popleft()) #实现转动

for _ in range(3):

t2.append(t2.popleft())

#print(t1)

#print(t2)

def dec(s):

i = t2[(ord(s) - ord('a'))] #ord(s) - ord('a')就可以得到在那个a到z的字符中的索引值

i = t1[(i)]

print(alpha[i], end='')

t1.append(t1.popleft())

alpha.append(alpha.popleft())

for s in ss: dec(s)

7547de8078b09f3e6ccfa4b953c8ed92.png

easyjni

关键就在这:

12ef0cadc41bbe7641f55d3a787b5e08.png

java层的算法:

cda5ca8980050e7c5aa4725c4dbf78a7.png

有了之前的经验,猜是换了密码表的base64编码。

然后看so文件:

46ea06a6c913458677edcc507a1ddd4b.png

e71acf9b0ef99986c79626ebec715c04.png

整体思路就是这样...

exp:

import base64

#每2位交换位置

str1 = list("MbT3sQgX039i3g==AQOoMQFPskB1Bsc7")

str1_result = ''

for i in range(0, len(str1), 2):

str1_result += str1[i+1] + str1[i]

#前16和后16交换位置

str2 = list(str1_result)

str2_result = ''.join(str2[i] for i in range(16, 32)) + ''.join(str2[j] for j in range(0, 16))

#变异base64解密

base_now = ['i', '5', 'j', 'L', 'W', '7', 'S', '0', 'G', 'X', '6', 'u', 'f', '1', 'c', 'v',

'3', 'n', 'y', '4', 'q', '8', 'e', 's', '2', 'Q', '+', 'b', 'd', 'k', 'Y', 'g',

'K', 'O', 'I', 'T', '/', 't', 'A', 'x', 'U', 'r', 'F', 'l', 'V', 'P', 'z', 'h',

'm', 'o', 'w', '9', 'B', 'H', 'C', 'M', 'D', 'p', 'E', 'a', 'J', 'R', 'Z', 'N']

base_now_str = ''.join(i for i in base_now)

base_original_str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

flag = base64.b64decode(str2_result.translate(str.maketrans(base_now_str, base_original_str)))

print(flag)

365ca45c5456222fdf668d95a2295f0f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值