XCTF---easyjni的WriteUp

一、题目来源

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


二、解题过程

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

XCTF---easyjni的WriteUp

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

XCTF---easyjni的WriteUp

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

XCTF---easyjni的WriteUp

XCTF---easyjni的WriteUp

    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;
}

XCTF---easyjni的WriteUp

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

XCTF---easyjni的WriteUp

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

XCTF---easyjni的WriteUp


三、附件

  获取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)
上一篇:buuctf Re Youngter-drive Writeup


下一篇:HCTF_2018-Writeup【web题】