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。