拿到题目,直接JEB开搞
找到两个关键地方:
将输入传入check函数,判断结果由stringFromJNI2函数输出flag。
这两个函数都是Native函数
还是要逆一下so了
看了一下stringFromJNI2函数,看起来爆破不太可能了,只能继续逆chec函数。
chec伪代码里看出大致思路:调用Java层的三个check函数对输入数字进行处理,然而毕竟是伪代码,要得到真正的逻辑我们还需要看汇编。
可以看出IDA转换为伪代码的时候,* _JNIEnv::CallIntMethod*少传了一个参数
因此调用的应该是:
result = _JNIEnv::CallIntMethod(Evn, obj, *(&check1_id + 2 * _99 % 3), _99 - 1);
Java层的三个check代码为:
public int check1(int input, int s) {
int v1 = input;
int v0;
for(v0 = 1; v0 < 100; ++v0) {
v1 += v0;
}
return this.chec(v1, s);
}
public int check2(int input, int s) {
int v2;
int v3 = 1000;
int v1 = input;
if(s % 2 == 0) {
int v0;
for(v0 = 1; v0 < v3; ++v0) {
v1 += v0;
}
v2 = this.chec(v1, s);
}
else {
for(v0 = 1; v0 < v3; ++v0) {
v1 -= v0;
}
v2 = this.chec(v1, s);
}
return v2;
}
public int check3(int input, int s) {
int v1 = input;
int v0;
for(v0 = 1; v0 < 10000; ++v0) {
v1 += v0;
}
return this.chec(v1, s);
}
写了一个脚本逆向这个流程:
#! /usr/bin/env python
#-*- coding: utf-8 -*-
def getNumber():
output = 1835996258
for i in range(2,100):
num = 2 * i % 3
if num == 0:
output = check1(output, i - 1)
elif num == 1:
output = check2(output, i - 1)
else:
output = check3(output, i - 1)
print output
def check1(input, loopNum):
t = input
for i in range(1,100):
t -= i
return t
def check2(input, loopNum):
t = input
if loopNum % 2 == 0:
for i in range(1,1000):
t -= i
return t
for i in range(1,1000):
t += i
return t
def check3(input, loopNum):
t = input
for i in range(1,10000):
t -= i
return t
if __name__ == '__main__':
getNumber()
得到 236492408
输入得flag:alictf{Jan6N100p3r}