AliCTF2016-LoopAndLoop

拿到题目,直接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}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值