bugku逆向LoopAndLoop--沙窝里的王

本文记录了一次使用安卓模拟器和逆向工具JEB解决LoopAndLoop挑战的过程。通过输入分析,发现关键函数check和stringFromJNI2,其中涉及Native函数的逆向。最终通过网络资源辅助,得出密码236492408,并获取到flag:alictf{Jan6N100p3r},作者反思自身在逆向和编程能力上的不足,决定加强学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

终于下载好安卓模拟器了,就来解决这道题吧(因为工具用的还不熟悉,所以是在互联网帮助下解决的……)
首先下载好文件解压,然后用安卓模拟器打开:
在这里插入图片描述输入数字 会出现 Not Right! 输入字母 会出现Not a Valid Integer number 。
直接JEB开搞吧:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(2130968600);
        this.findViewById(2131492946).setOnClickListener(new View$OnClickListener() {
            public void onClick(View v) {
                int inputInteger;
                String inputIntegerString = this.val$ed.getText().toString();
                try {
                    inputInteger = Integer.parseInt(inputIntegerString);
                }
                catch(NumberFormatException v0) {
                    this.val$tv1.setText("Not a Valid Integer number");
                    return;
                }

                if(MainActivity.this.check(inputInteger, 99) == 1835996258) {               //关键点1
                    this.val$tv1.setText("The flag is:");
                    this.val$tv2.setText("alictf{" + MainActivity.this.stringFromJNI2(inputInteger) + 
                            "}");//关键点2
                }
                else {
                    this.val$tv1.setText("Not Right!");
                }
            }
        });
    }

发现关键点1,2
将输入传入check函数,判断结果由stringFromJNI2函数输出flag。
这两个函数都是Native函数 :

public native int chec(int arg1, int arg2) {
    }

    public int check(int input, int s) {
        return this.chec(input, s);
    }
 public String messageMe(String text) {
        return "LoopOk" + text;
    }

还是要逆一下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);
    }

很明显,我自己写不出来这个逆向代码,就联网了一下:



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
再次在模拟器上运行此APK输入得flag:alictf{Jan6N100p3r}

感触颇深啊
通过这道题,明显感到了自己还差的很多,比如逆向代码的编写,代码分析等等,总之来说自己的编程能力还明显不足,以后得好好补补了,不能再急躁了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值