小灰灰~ 发表于 2018-1-9 21:03

Android ctf 算法破解

今天我给大家带来的是一个android 的ctf破解(大佬绕行{:1_893:}{:1_893:}{:1_893:}{:1_893:}),安装包在结尾处献上。
开始我们的破解,需要到的工具 Android killer,python IDE,蓝蝶模拟器


先看看apk的运行效果:



首先使用 Android killer打开我们的apk:

我们直接查看ManActivity.smail的代码



接下来我们查看DES加密的代码:




在MainActivity.smail中,查看 private boolean check()函数

.method private check()Z
    .locals 7

    .prologue
    const/4 v3, 0x0

    .line 96
    const/16 v4, 0x20

    new-array v0, v4, [B

    fill-array-data v0, :array_0

    .line 99
    .local v0, "b2":[B
    iget-object v4, p0, Lcom/example/test1/MainActivity;->result1:Ljava/lang/String;

    invoke-virtual {v4}, Ljava/lang/String;->getBytes()[B

    move-result-object v1

    .line 102
    .local v1, "b3":[B
    const/4 v2, 0x0

    .local v2, "j":I
    :goto_0
    array-length v4, v1

    if-lt v2, v4, :cond_1

    .line 106
    array-length v4, v1

    array-length v5, v0

    if-ne v4, v5, :cond_0

    .line 107
    const/4 v2, 0x0

    :goto_1
    array-length v4, v0

    if-lt v2, v4, :cond_2

    .line 114
    const/4 v3, 0x1

    .line 116
    :cond_0
    return v3

    .line 103
    :cond_1
    const-string v4, "test"

    new-instance v5, Ljava/lang/StringBuilder;

    invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V

    aget-byte v6, v1, v2

    xor-int/2addr v6, v2

    int-to-byte v6, v6

    invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v5

    invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v5

    invoke-static {v4, v5}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    .line 102
    add-int/lit8 v2, v2, 0x1

    goto :goto_0

    .line 108
    :cond_2
    aget-byte v4, v1, v2

    aget-byte v5, v0, v2

    xor-int/2addr v4, v5

    if-ne v4, v2, :cond_0

    .line 107
    add-int/lit8 v2, v2, 0x1

    goto :goto_1

    .line 96
    nop

    :array_0
    .array-data 1
      0x66t
      0x43t
      0x77t
      0x70t
      0x67t
      0x56t
      0x48t
      0x37t
      0x7ct
      0x58t
      0x5dt
      0x4at
      0x55t
      0x38t
      0x25t
      0x6bt
      0x5ft
      0x72t
      0x7ft
      0x7ct
      0x41t
      0x7ct
      0x66t
      0x4et
      0x4ct
      0x6at
      0x6at
      0x69t
      0x28t
      0x24t
      0x5dt
      0x73t
    .end array-data
.end method

这段代码主要流程是:
先定义一个32位长的数组array1=
然后result中保存的数组长度要求也是32位,否则直接返回false
array-length v4, v1   #v1保存的是resultv4 result的长度

    array-length v5, v0   #v0保存的是array1v5 array1的长度

    if-ne v4, v5, :cond_0 # 长度不相等,跳转到cound_0

    .line 107
    const/4 v2, 0x0

    :goto_1
    array-length v4, v0

    if-lt v2, v4, :cond_2

    .line 114
    const/4 v3, 0x1

    .line 116
    :cond_0                #跳转到这里,代码开始处有: const/4 v3, 0x0 v3 是0,所以这里返回的是false
    return v3
然后进行32次循环,array1和result中的数据进行异或,并判断是否等于循环的次数i
for (int i=0;i<32;i++){
      if(array^result==i){
          continue
       }
   else{
      return false
    }

return true


基本的思路理清后,我们开始进行破解:
程序基本思路:
输入内容->程序获取我们输入的数据->将我们输入的内容进行des加密->des加密后的数据进行base64加密->与array1进行异或并判断


array1我们在源代码中可以找见
1. array1=
2. 然后将arra1中的数据与1,2,3,4,5.。。。。。。。。。。,进行异或
3. 将异或后的数据进行base64解密
4. base64解密后的数据进行des解密,得到的结果就是密码

我用python写了一个简单的破解脚本:
#encoding=utf-8

from pyDes import des, CBC, PAD_PKCS5
import base64

'''
DES解密
'''
def des_descrypt(s):
        secret_key ='poi7y6gt'
        iv = "\x01\x02\x03\x04\x05\x06\x07\x08"
        k=des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
        de=k.decrypt(s,padmode=PAD_PKCS5)
        return de

'''
base64解码
'''
def base64_decode(s):
        return base64.b64decode(s)

def main():
        array1 =
        result=""
        for i in range(32):
                array1=array1^i
                result+=chr(array1)
        base64_result=base64_decode(result)
        des_result=des_descrypt(base64_result)
        print("密码:%s" % des_result)

if __name__=='__main__':
        main()


运行后的结果:


在apk中输入我们的密码:



到此破解完成。写这篇文章主要是为了记录一下自己的学习过程,另一方面为了给刚入门的老铁们一个简单学习资料。


不要喷我,不要喷,不要喷!!!!!!
apk地址:链接:https://pan.baidu.com/s/1bq8ACDx 密码:mskf

小灰灰~ 发表于 2018-1-10 09:10

Huggo1995 发表于 2018-1-9 23:51
用的是sublime吗?什么插件编译的呀,求推荐…

https://www.zhihu.com/question/22904994

恶梦玩家 发表于 2018-1-9 21:20

前来膜拜大神.{:1_913:}

Huggo1995 发表于 2018-1-9 23:51

用的是sublime吗?什么插件编译的呀,求推荐…

verybest2012 发表于 2018-1-10 09:53

谢谢楼主分享

yns 发表于 2018-1-14 09:53

感谢分享,共同进步

KingKongYZD 发表于 2018-3-19 15:21

看不懂啊 老哥

往復不息 发表于 2018-3-20 22:23

谢谢楼主,受教了

六源六 发表于 2018-3-20 22:48

学习学习

ban_op 发表于 2018-3-26 19:02

前来学习收集经验
页: [1] 2
查看完整版本: Android ctf 算法破解