内容简介:如今,在做APP安全测试的时候,越来越多的APP数据使用加密传输,一般的做法都需要去逆向APP并寻找到加解密算法。今天主要介绍一下iOS的一些逆向基础知识,教大家碰到加密数据的APP后该如何去解密。今天主要是针对两款有不同加密方式的iOS应用,难度由低到高。
介绍
如今,在做APP安全测试的时候,越来越多的APP数据使用加密传输,一般的做法都需要去逆向APP并寻找到加解密算法。今天主要介绍一下iOS的一些逆向基础知识,教大家碰到加密数据的APP后该如何去解密。
今天主要是针对两款有不同加密方式的iOS应用,难度由低到高。
案例一:
首先解决挂代理抓不到包的问题
使用objection ios sslpinning disable绕过证书绑定
在登录处抓包发现,request包和response包都为加密传输:
appmon提供的scripts
hack.lu提供的scripts
通过参考github上的js脚本,改写了个较为全面的hook.js脚本:
// Intercept the CCCrypt call.
Interceptor.attach(Module.findExportByName('libcommonCrypto.dylib', 'CCCrypt'), {
onEnter: function (args) {
// Save the arguments
this.operation = args[0]
this.CCAlgorithm = args[1]
this.CCOptions = args[2]
this.keyBytes = args[3]
this.keyLength = args[4]
this.ivBuffer = args[5]
this.inBuffer = args[6]
this.inLength = args[7]
this.outBuffer = args[8]
this.outLength = args[9]
this.outCountPtr = args[10]
console.log('CCCrypt(' +
'operation: ' + this.operation +', ' +
'CCAlgorithm: ' + this.CCAlgorithm +', ' +
'CCOptions: ' + this.CCOptions +', ' +
'keyBytes: ' + this.keyBytes +', ' +
'keyLength: ' + this.keyLength +', ' +
'ivBuffer: ' + this.ivBuffer +', ' +
'inBuffer: ' + this.inBuffer +', ' +
'inLength: ' + this.inLength +', ' +
'outBuffer: ' + this.outBuffer +', ' +
'outLength: ' + this.outLength +', ' +
'outCountPtr: ' + this.outCountPtr +')')
if (this.operation == 0) {
// Show the buffers here if this an encryption operation
console.log("In buffer:")
console.log(hexdump(ptr(this.inBuffer), {
length: this.inLength.toInt32(),
header: true,
ansi: true
}))
console.log("Key: ")
console.log(hexdump(ptr(this.keyBytes), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
console.log("IV: ")
console.log(hexdump(ptr(this.ivBuffer), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
}
},
onLeave: function (retVal) {
if (this.operation == 1) {
// Show the buffers here if this a decryption operation
console.log("Out buffer:")
console.log(hexdump(ptr(this.outBuffer), {
length: Memory.readUInt(this.outCountPtr),
header: true,
ansi: true
}))
console.log("Key: ")
console.log(hexdump(ptr(this.keyBytes), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
console.log("IV: ")
console.log(hexdump(ptr(this.ivBuffer), {
length: this.keyLength.toInt32(),
header: true,
ansi: true
}))
}
}
})
使用frida hook CCCrypt函数
operation: 0x0代表加密,0x1代表解密,CCAlgorithm: 0x0指加密方式是kCCAlgorithmAES128,CCOptions: 0x1指模式是cbc,key=DATA_KEY20150116和iv=20150116
参阅CommonCryptor.h各参数意义
案例二:
在登录处抓包发现,request包和response包都为加密传输:
使用hook.js脚本发现hook不到
老方法,首先使用frida-ios-dump对该APP进行一键dump
frida-ios-dump,该 工具 基于frida提供的强大功能通过注入js实现内存dump
然后通过 python 自动拷贝到电脑生成ipa文件,通过配置完成之后真的就是一条命令砸壳。
砸壳完成后会生成ipa文件,我们解压缩然后使用IDA加载完二进制文件
然后在String窗口搜索loginbypassword(这个是登录时的信息),搜索后进入对应的类,接下来我们进入这个类看它用了哪些方法
找到这个字符串引用的代码位置
之后双击callWebAPI:data:method:ssl:completionHandler:
找到[WebService callWebAPI:data:method:ssl:completionHandler:]
然后F5一下
浏览该类发现可以看到data等关键加密信息,接着我们尝试搜索data前面的setValue:forKey
[_priv_NBSSafeMutableDictionary setValue:forKey:]查看该类发现无结果,返回上一步重新查看加密所在的类
v87由v86 = -WebService returnDictionaryWithDataPath:返回
查看returnDictionaryWithDataPath:
v8 = +RSA encryptString:privateKey:;
v4由convertToJsonData:返回(明文)v6由AppPrivate返回(密钥)
查看密钥返回函数AppPrivate和encryptString:privateKey函数
然后使用frida进行hook
使用objection
ios hooking watch method “+[RSA encryptString:privateKey:]” –dump-args ios hooking watch method “+[RSA encryptString:privateKey:]” –dump-return
直接使用objection的这两句命令可以达到同样的效果
附JS:
if (ObjC.available){
try{
var className = "RSA";
var funcName = "+ encryptString:privateKey:";
var hook = eval('ObjC.classes.' + className + '["' + funcName + '"]');
console.log("[*] Class Name: " + className);
console.log("[*] Method Name: " + funcName);
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var param1 = new ObjC.Object(args[2]);
console.log("args[2] -> " + param1);
var param2 = new ObjC.Object(args[3]);
console.log("args[3] -> " + param2);
},
onLeave: function(retval) {
var retur = new ObjC.Object(retval);
console.log("retval -> " + retur);
}
});
}
catch(err){
console.log("[!] Exception2: " + err.message);
}
}
else{
console.log("Objective-C Runtime is not available!");
}
以上所述就是小编给大家介绍的《移动应用安全基础篇——解密iOS加密数据》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Haskell School of Music
Paul Hudak、Donya Quick / Cambridge University Press / 2018-10-4 / GBP 42.99
This book teaches functional programming through creative applications in music and sound synthesis. Readers will learn the Haskell programming language and explore numerous ways to create music and d......一起来看看 《The Haskell School of Music》 这本书的介绍吧!