• 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)
  • 相关阅读:
    mysql存储过程(查询数据库内表 游标循环 if判断 插入别的表内)
    Java中调用文件中所有bat脚本
    读取pdf内容分页和全部
    前向传播
    Broadcasting 维度扩张的手段
    维度变换
    Selective Indexing
    tensorflow索引和切片
    创建tensor
    c++线程中使用detach()导致的内存非法引用问题
  • 原文地址:https://www.cnblogs.com/aWxvdmVseXc0/p/12198459.html
Copyright © 2020-2023  润新知