0x10 timer[阿里ctf]

一道安卓题,接触不多,使用jdk-gui打开找到main函数

这里的关键是时间差,而且可以看到是二十万秒后,换算一下两天多,不想做就慢慢挂起也行啊。

然后就是时间到了之后使用方法native String stringFromJNI2(int i)计算得到flag的值,但是这里native方法是安卓一种消息机制,短时间内不能找到该函数,而且还有一个重要参数K的传入,这里我们还需要计算k值

所以先用脚本模拟计算k值,这里我写的python

k = 0
def is2(i):
    if i <= 3:
        if i > 1:
            return True
        return False
    elif i % 2 == 0 or i % 3 == 0:
        return False
    else:
        x = 5
        while x * x <= i:
            if i%x == 0 or i%(x+2) == 0:
                return  False
            x += 6
        return True
​
if __name__ == '__main__':
    for i in range(200000,0,-1):
        if is2(i):
            k += 100
        else:
            k -= 1
    print(k,hex(k))
    
#1616384 0x18aa00

成功计算到K值之后,就可以想办法修改k值和beg值重打包apk

因为jdk没有编译功能,所以使用Androidkiller,但是直接k值会报错不能一个int复制到short,所以在其他地方修改值。

在MainActivity.smali中修改beg的值,将 const v1,0x30D40 修改为 const v1,0x0

然后在MainActivity$1.smali中添加一行代码 const v3,0x18aa00,添加在调用stringFromJNI2方法之前。

然后编译,使用模拟器打开,因为起始值就是0了,所以这里是负值。

0x20 逆向入门

这题……和逆向没关系,也别说是入门吧,就杂项还差不多。

拿到之后,不能运行,查壳也是显示不是可执行文件,然后用edit010打开发现:

额(⊙o⊙)…就base64的图片呗。这种呢浏览器是直接可以处理的,就像这样

<img src = "data:image/png;base64,ivBORw0......">

所以新建一个html文件,然后使用上述语句,将这个所谓的“exe”的内容复制到引号里面即可

扫码获取flag。