吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6562|回复: 11
收起左侧

[Android CTF] Android ctf 算法破解

  [复制链接]
小灰灰~ 发表于 2018-1-9 21:03
今天我给大家带来的是一个android 的ctf破解(大佬绕行),安装包在结尾处献上。
开始我们的破解,需要到的工具 Android killer,python IDE,蓝蝶模拟器


先看看apk的运行效果:
3.png


首先使用 Android killer打开我们的apk:
4.png
我们直接查看ManActivity.smail的代码
5.png

6.png
接下来我们查看DES加密的代码:
7.png
8.png
11.png

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

[Asm] 纯文本查看 复制代码
.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=[102, 67, 119, 112, 103, 86, 72, 55, 124, 88, 93, 74, 85, 56, 37, 107,95, 114, 127, 124, 65, 124, 102, 78, 76, 106, 106, 105, 40, 36, 93, 115]
然后result中保存的数组长度要求也是32位,否则直接返回false
[Asm] 纯文本查看 复制代码
 array-length v4, v1   #v1保存的是result  v4 result的长度

    array-length v5, v0   #v0保存的是array1  v5 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=[102, 67, 119, 112, 103, 86, 72, 55, 124, 88, 93, 74, 85, 56, 37, 107,95, 114, 127, 124, 65, 124, 102, 78, 76, 106, 106, 105, 40, 36, 93, 115]
2. 然后将arra1中的数据与1,2,3,4,5.。。。。。。。。。。,进行异或
3. 将异或后的数据进行base64解密
4. base64解密后的数据进行des解密,得到的结果就是密码

我用python写了一个简单的破解脚本:
[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 = [102, 67, 119, 112, 103, 86, 72, 55, 124, 88, 93, 74, 85, 56, 37, 107,95, 114, 127, 124, 65, 124, 102, 78, 76, 106, 106, 105, 40, 36, 93, 115]
	result=""
	for i in range(32):
		array1[i]=array1[i]^i
		result+=chr(array1[i])
	base64_result=base64_decode(result)
	des_result=des_descrypt(base64_result)
	print("密码:%s" % des_result)

if __name__=='__main__':
	main()



运行后的结果:
11.png

在apk中输入我们的密码:
12.png


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


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

免费评分

参与人数 5威望 +1 吾爱币 +12 热心值 +5 收起 理由
XOR + 1 + 1 不错
ban_op + 1 + 1 谢谢@Thanks!
审判者压缩 + 1 + 1 我很赞同!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
610100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 小灰灰~ 发表于 2018-1-10 09:10
Huggo1995 发表于 2018-1-9 23:51
用的是sublime吗?什么插件编译的呀,求推荐…

https://www.zhihu.com/question/22904994
恶梦玩家 发表于 2018-1-9 21:20
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
前来学习收集经验
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 22:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表