XCTF---easyjni的WriteUp

一、题目来源

    题目来源:XCTF的mobile区的easyjni题目。
    题目下载地址:题目链接地址


二、解题过程

    1、下载好题目后,安装到夜神模拟器中,发现有一个输入框和一个按钮,随便输入内容,点击按钮后发现弹出信息You are wrong!Bye~

4.PNG

    2、将该apk拖进AK中反编译,反编译完成后搜索字符串You are wrong!,发现该信息位于MainActivity.java中。

5.PNG

    3、用jeb反编译直接查看反编译后的java代码,发现zaiMainActivity中首先导入了一个名为native的so文件,然后查看You are wrong!Bye~信息处发现将输入框得到的字符串与MainActivity的b属性作为参数调用MainActivity中的a(string,string)方法返回的布尔值作为是否通关条件的。

1.PNG

3.PNG

    4、再来看一下a(string,string)方法,该方法返回第一个参数调用的a(string)方法的返回值,传进去的参数为输入框中的字符串,而方法a(string)则是调用ncheck方法,返回值也是ncheck函数的返回值,传进去的参数则是调用实例化了a类的a函数的返回值,a类的a函数传进去的参数为一个字节数组,再去看一下a类的a函数,很明显是一个base64加密,只是编码表变了一下而已。

a(string)函数:

private boolean a(String arg3) {
    boolean v0_1;
    try {
        v0_1 = this.ncheck(new a().a(arg3.getBytes()));
    }
    catch(Exception v0) {
        v0_1 = false;
    }

    return v0_1;
}

2.PNG

    5、用ida打开so文件,找到ncheck函数,发现将传进来的字符串首先将前16个字符和后16个字符交换位置,然后将这个新字符串两两一组互相交换位置,最后和一个字符串比较,相等则返回TRUE

6.PNG

    6、获取flag思路也很简单了,首先将字符串两两一组交换位置,然后将前16个字符和后16个字符交换位置,然后将这个新的字符串用自定义的basr64编码表解码即可得到flag,写了个脚本,跑出来结果如下:

7.PNG


三、附件

  获取flag的python脚本如下(需要python版本至少为3.6):

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 = 'i5jLW7S0GX6uf1cv3ny4q8es2Q+bdkYgKOIT/tAxUrFlVPzhmow9BHCMDpEaJRZN'
Ciphertext = 'QAoOQMPFks1BsB7cbM3TQsXg30i9g3=='

i = 0

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

print(flag)
原文地址:https://www.cnblogs.com/aWxvdmVseXc0/p/12198459.html