BugkuCTF-Reverse题LoopAndLoop(阿里CTF)

下载apk文件
先解压安装下看看什么情况
打开文件,得到一个LoopAndLoop的apk,打开进去,让输密码,点击按钮,可以看到Not Right!或者Not a valid integer number的提示,显然,只要找到密码,找到flag就快了
在这里插入图片描述
接着直接··载入JEB
双击MainActivity
在这里插入图片描述
右键->解析
下面我把文件保存下来,看得舒服一点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其里包含两个原生函数,chec和stringFromJNI2。根据oncreate的setOnClickListener里得到的逻辑可知,通过一个整数,调用chec与一个magic number 1835996258比较,如果比较成功,通过这个整数,代入stringFromJNI2得到flag。

再关注以下3个check函数,循环的执行结果是可以预测到的,分别是从1加到100,从1加到1000,从1加到10000,显然可以换为常数的加减。

经过分析可知重要的chec和stringFromJNI2都在native层

再关注原生层:
Android里的so文件是动态链接库,是二进制文件,即ELF文件。多用于NDK开发里。
IDA打开libs/armaebi/liblhm.so,找到chec(因为如果chec能过,那么这个整数代入stringFromJNI2就可以得到FLAG了)
那么就需要将liblhm.so文件载入IDA进行分析啦
在这里插入图片描述
载入后直接shift+F12搜索字符串
双击MainActivity进入
在这里插入图片描述
接着双击“蓝色向上的小箭头“ 找到引用
在这里插入图片描述
再按F5就可以将chec反汇编成伪代码了
在这里插入图片描述
_JNIEnv::GetMethodID:
GetFieldID是得到java类里的参数ID,GetMethodID得到java类里方法的ID,它们只能调用类里声明为 public的参数或方法。

_JNIEnv::CallIntMethod:
得到java类里Int类型的方法

经过分析,可以知道chec方法根据第二个参数乘2对3取模的结果调用Java层的三个check函数对我们的输入进行处理

def getinput():
    target = 1835996258
    for i in range(2,100):
        if 2 * i % 3 == 0:
            target = check1(target,i - 1)
        elif 2 * i % 3 == 1:
            target = check2(target,i - 1)
        else:
            target = check3(target,i - 1)
    print(target)
def check1(input,loopNum):
    t = input
    for i in range(1,100):
        t = t - i
    return t
 
def check3(input,loopNum):
    t = input
    for i in range(1,10000):
        t = 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
 
if __name__ == '__main__':
  getinput()

运行脚本,得到一个值,输入到输入框里,得到flag
成功截图
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值