好友
阅读权限10
听众
最后登录1970-1-1
|
小灰灰~
发表于 2018-1-9 21:03
今天我给大家带来的是一个android 的ctf破解(大佬绕行),安装包在结尾处献上。
开始我们的破解,需要到的工具 Android killer,python IDE,蓝蝶模拟器
先看看apk的运行效果:
首先使用 Android killer打开我们的apk:
我们直接查看ManActivity.smail的代码
接下来我们查看DES加密的代码:
在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()
运行后的结果:
在apk中输入我们的密码:
到此破解完成。写这篇文章主要是为了记录一下自己的学习过程,另一方面为了给刚入门的老铁们一个简单学习资料。
不要喷我,不要喷,不要喷!!!!!!
apk地址:链接:https://pan.baidu.com/s/1bq8ACDx 密码:mskf
|
免费评分
-
查看全部评分
|