【0-4】安卓逆向-ctf入门

buuctf

helloworld

下载后是apk文件
使用dex2jar转为jar包,在使用jd-gui反编译jar包
flag{7631a988259a00816deda84afb29430a}
在这里插入图片描述

java逆向解密

下载后是.class文件,jd-gui打开该文件后。

解密原理:arr[i] + 64 ^ 0x20 =key[i]

KEY = [180, 136, 137, 147, 191, 137, 147, 191, 148, 136,
        133, 191, 134, 140, 129, 135, 191, 65]
for i in KEY:
    a = i-64^0x20
    print(chr(a),end='')

flag{This_is_the_flag_!}
在这里插入图片描述

findit

下载文件是apk.zip,解压出apk文件。
方法一:jadx
代码逻辑:对输入的值进行判断,在对已有的数组进行处理后输出
在这里插入图片描述

old_flag = ['p', 'v', 'k', 'q', '{', 'm', '1', '6', '4', '6', '7', '5', '2', '6', '2', '0', '3', '3', 'l', '4', 'm', '4', '9', 'l', 'n', 'p', '7', 'p', '9', 'm', 'n', 'k', '2', '8', 'k', '7', '5', '}']
tmp = ""
for i in old_flag:
    if (i >='A' and i<='Z') or (i>='a' and i<='z'):
        b= chr(ord(i)+16)

        if (b >'Z' and b <'a') or ( b>='z'):

            tmp+= chr(ord(b)-26)
        else:
            tmp += chr(ord(i) + 16)

    else:
        tmp+= i
print(tmp)

在这里插入图片描述
或者运行apk,输入答案LzakAkLzwXdsyZgew(对数组a写脚本处理的结果)
在这里插入图片描述

Bugku

signin

下载是个apk文件。运行如下图
在这里插入图片描述
jeb反编译apk,程序逻辑是对字符串反转在base64解码,最后flag为:flag{Her3_i5_y0ur_f1ag_39fbc_}
在这里插入图片描述

使用其他工具无法直接看到字符串内容,流程如下
AndroidManifest.xml的确定re.sdnisc2018.sdnisc_apk1.MainActivity这个类。反汇编出smali文件的,解析此。可以看错getFlag和checkPassword函数。getFlag确定资源id:0x7f0b0020.资源id由R#string.smali获取,确定资源名toString。在资源文件strings.xml找到资源名toString

mobile1

下载的是apk文件,模拟器中运行apk
在这里插入图片描述
jeb查看apk,代码逻辑:输入的字符串与username(md5后转16进制后在取下标偶数位)相同
B9C77224FF234F27AC6BADF83B855C76->bc72f242a6af3857->flag{bc72f242a6af3857}
在这里插入图片描述

First_Mobile

下载是apk文件,jeb打开,关键在check中
在这里插入图片描述
输入的字符串经过两次for循环处理后仍与原始字符串相同。
在这里插入图片描述

b = [23, 22, 26, 26, 25, 25, 25, 26, 27, 28, 30, 30, 29, 30, 0x20, 0x20]
arg7 = "ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890{}_"
str_end =""

for i in range(len(b)):
    for j in range(len(arg7)):
        tmp_b = str.encode(arg7[j])
        tmp = (ord(tmp_b) + b[i]) % 61
        temp = tmp*2 - i
        # print(chr(temp))
        if temp == ord(tmp_b):
            str_end +=tmp_b.decode()
print(str_end)
#LOHILMNMLKHILKHI

看别人的wp还有另一种方法:str[i] = 122+i-2*b[i]

((a1[i]+b[i])%61)*2 - i = a1[i]
((a1[i]+b[i])%61)*2 = a1[i] + i
(a1[i]%61 + b[i] )  *2 = a1[i] + i
a1[i]%61 属于0-61
a1[i] 属于 61-122
则 a1[i]%61 = a[i]-61
2* a1[i] -122 +2*b[i] = a1[i] +i

timer

下载是个apk文件。

在这里插入图片描述
1.从is2函数获取k,
2.修改smali文件->修改if条件为>0;用获取到的k传入stringFromJNI2函数中。

public class text{
	
    public static boolean is2(int n) {
        if(n <= 3) {
            return n > 1;
        }

        if(n % 2 == 0 || n % 3 == 0) {
            return false;
        }

        for(int i = 5; i * i <= n; i += 6) {
            if(n % i == 0 || n % (i + 2) == 0) {
                return false;
            }
        }

        return true;
    }
    public static void main(String args[]){
    	int time=200000;
    	int k=0;
    	while(time>0){
	    	if(is2(time)){
	    		k+=100;
	    	}
			else{
	    		k--;
	    	}
	    	time--;
	    }
    	System.out.println(k);
    	//1616384
    	
    }
}

使用ak修改下图中的两处,
在这里插入图片描述
AK打开此apk,搜索stringFromJNI2,选择MainActivity$1.smali
在这里插入图片描述
为什么是MainActivity$1.smali而不是MainActivity.smali呢?
因为主要的判断逻辑是在OnClickListener这个类里,而这个类是MainActivity的一个内部类,同时我们在实现的时候也没有给这个类声明具体的名字,所以这个类用$1表示。

在这里插入图片描述

重新编译打包签名运行后flag已经显示出来了。
flag{Y0vAr3TimerMa3te7}
在这里插入图片描述

safebox

下载后是apk文件,运行效果

有两个activity
在这里插入图片描述
只有for循环中有差异。
在这里插入图片描述
将两个算法都实现以下,看看结果符合题目描述的就是正确答案
描  述: flag格式NJCTF{xxx} 并且 xxx只包含[a-z][A-Z][0-9]
在这里插入图片描述
NJCTF{have05if4n}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值