MASTG-TECH-0070: Extraindo Informações do Binário da Aplicação
Você pode usar o radare para obter informações sobre o binário, como a arquitetura, a lista de bibliotecas compartilhadas, a lista de classes e métodos, strings e muito mais.
Vamos usar o Damn Vulnerable iOS App DVIA v1 como exemplo. Abra seu binário principal com o radare2:
r2 DamnVulnerableIOSApp
Informações do Binário¶
Para obter informações sobre o binário, você pode usar o comando i. Este comando listará informações sobre o binário, como a arquitetura, a lista de bibliotecas compartilhadas, a lista de classes e métodos, strings e muito mais.
[0x1000180c8]> i
...
size 0x43d5f0
humansz 4.2M
mode r-x
format mach064
iorw false
block 0x100
packet xtr.fatmach0
...
lang objc with blocks
linenum false
lsyms false
nx false
os ios
pic true
relocs true
sanitize false
static false
stripped true
Classes e Métodos¶
Podemos então prosseguir para extrair informações sobre os métodos no código-fonte do aplicativo. Para isso, precisamos carregar o binário do aplicativo no radare e depois listar as classes e métodos no binário.
[0x1000180c8]> icc
...
@interface SFAntiPiracy : NSObject
{
}
+ (int) isPirated
+ (int) isJailbroken
+ (void) killApplication
+ (bool) isTheDeviceJailbroken
+ (bool) isTheApplicationCracked
+ (bool) isTheApplicationTamperedWith
+ (int) urlCheck
...
@end
Observe o sinal de mais (+), que significa que este é um método de classe que retorna um tipo BOOL.
Um sinal de menos (-) significaria que este é um método de instância. Consulte as seções posteriores para entender a diferença prática entre eles.
Bibliotecas Vinculadas¶
O seguinte comando lista as bibliotecas compartilhadas:
[0x1000180c8]> il
[Linked libraries]
/System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration
/System/Library/Frameworks/StoreKit.framework/StoreKit
/System/Library/Frameworks/Security.framework/Security
/System/Library/Frameworks/QuartzCore.framework/QuartzCore
/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices
/usr/lib/libz.1.dylib
/System/Library/Frameworks/CoreLocation.framework/CoreLocation
/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics
/System/Library/Frameworks/CFNetwork.framework/CFNetwork
/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox
/System/Library/Frameworks/CoreData.framework/CoreData
/System/Library/Frameworks/UIKit.framework/UIKit
/System/Library/Frameworks/Foundation.framework/Foundation
/usr/lib/libobjc.A.dylib
/usr/lib/libSystem.B.dylib
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
16 libraries
Strings¶
Obter strings é muito útil ao fazer engenharia reversa de um aplicativo, pois pode fornecer muitas informações sobre a funcionalidade do app. Por exemplo, você pode encontrar URLs, endpoints de API, chaves de criptografia e muito mais. Também é possível encontrar strings que apontarão para funções interessantes, como a função de login ou uma função que verifica se o dispositivo está com jailbreak.
[0x1000180c8]> izz~cstring | less
29903 0x001d0b4c 0x1001d0b4c 5 6 5.__TEXT.__cstring ascii Admin
29904 0x001d0b52 0x1001d0b52 13 14 5.__TEXT.__cstring ascii This!sA5Ecret
29905 0x001d0b60 0x1001d0b60 15 16 5.__TEXT.__cstring ascii pushSuccessPage
29906 0x001d0b70 0x1001d0b70 4 5 5.__TEXT.__cstring ascii Oops
29907 0x001d0b75 0x1001d0b75 30 31 5.__TEXT.__cstring ascii Incorrect Username or Password
29908 0x001d0b94 0x1001d0b94 17 18 5.__TEXT.__cstring ascii usernameTextField
29909 0x001d0ba6 0x1001d0ba6 39 40 5.__TEXT.__cstring ascii T@"UITextField",&,N,V_usernameTextField
29910 0x001d0bce 0x1001d0bce 17 18 5.__TEXT.__cstring ascii passwordTextField
...
29915 0x001d0ca8 0x1001d0ca8 18 19 5.__TEXT.__cstring ascii http://google.com/
29926 0x001d0d73 0x1001d0d73 37 38 5.__TEXT.__cstring ascii Request Sent using pinning, lookout !
29927 0x001d0d99 0x1001d0d99 77 78 5.__TEXT.__cstring ascii Certificate validation failed.
You will have to do better than this, my boy!!