2016AliCTF-Timer writeup

考察知识点

  • smali代码修改

赛题链接

https://github.com/eternalsakura/ctf_pwn/blob/master/android逆向/Timer.apk

分析

jadx反编译之后,找逻辑。

总结就是:循环200000次,每循环一次停顿1秒左右,然后循环的时候进行is2()判断,根据判断的结果进行不同的操作。
写代码计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def is2(n):
if (n <= 3):
if (n > 1):
return True
return False
elif (n % 2 == 0 or n % 3 == 0):
return False
else:
i = 5
while (i * i <= n):
if (n % i == 0 or n % (i + 2) == 0):
return False
i += 6;
return True;

def main():
time = 200000
k = 0
while time > 0:
if is2(time):
k += 100
else:
k -= 1
time -= 1
print(k)


if __name__ == '__main__':
main()


计算得到,k=1616384

思路分析

得到要传入的数之后,接下来都是调用一个native方法,将这个数传进去得到结果。
可以修改smali文件重打包,也可以直接新建一个android工程,调用这个so文件。

直接调用so文件

Android Studio 默认的so文件路径是app/src/main/jniLibs/armeabi,新建一个jniLibs/armeabi文件夹,把so文件放进去。
且为了保证native层和java层的方法对应上,我们使用和原来apk一样的包名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package net.bluelotus.tomorrow.easyandroid;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("lhm");
}
public native String stringFromJNI2(int i);


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("sakura", stringFromJNI2(1616384));
}

}


得到flag,Y0vAr3TimerMa3te7

修改smali文件重打包

todo