6 en PT
6 en PT
com
Análise estática
~$ apktool d ygib-1.apk I:
Baksmaling...
I: Carregando tabela de recursos... . . .
Agora você podegreppara strings interessantes como URLs neste aplicativo, o que
pode ajudar a entender as comunicações entre esse aplicativo e um serviço da web.
Você também usagrepignorar quaisquer referências aesquemas.android . com,uma
string de namespace XML comum:
~$ grep -Eir "https?://" ygib-1 | grep -v "esquemas.android.com"
ygib-1/smali/com/yougetitback/androidapplication/settings/xml/ XmlOperator.smali:
ygib-1/res/values/strings.xml:
<string name="registrationerror5">ERRO: criando conta de usuário. Por favor, vá
para http://virgin.yougetitback.com/forgot_password onde você pode redefinir sua
senha, alternativamente digite uma nova
email e senha nesta tela e criaremos uma nova conta para você. Obrigado.</string>
ygib-1/res/values/strings.xml: https://virgin.yougetitback.com/vault</string>
<string name="link_accessvault">
ygib-1/
res/values/strings.xml: <string name="text_help"> Acesse seu site vault ou altere sua
senha em <a> https://virgin.yougetitback.com/forgot_password</a></string>
~$ androlyze.py –s
Em [1]: a,d,dx = AnalyzeAPK("/home/ahh/ygib-1.apk",decompiler="dad")
Em [23]: a. permissões
Fora[23]:
['android.permission.CAMERA',
'android.permission.CALL_PHONE',
'android.permission.PROCESS_OUTGOING_CALLS',
...
'android.permission.RECEIVE_SMS',
'android.permission.ACCESS_GPS',
'android.permission.SEND_SMS',
'android.permission.READ_SMS',
'android.permission.WRITE_SMS',
...
Essas permissões estão de acordo com o que você viu ao visualizar este aplicativo no
Google Play. Você pode dar um passo adiante com o Androguard e descobrir quais
96 Capítulo 4-Revisando a segurança do aplicativo
Embora a saída tenha sido detalhada, este trecho reduzido mostra alguns
métodos interessantes, como odo Postmétodo noConfirmPinScreenclasse, que deve
abrir um socket em algum momento enquanto exercitaandroid.permission .
INTERNET.Você pode ir em frente e desmontar este método para entender o que
está acontecendo chamandomostrarno método de destino emandrólise:
Em [38]: d.CLASS_Lcom_yougetitback_androidapplication_ConfirmPinScreen.
METHOD_doPost.show()
# # # # # # # # # # Informações do método Lcom/yougetitback/
androidapplication/ConfirmPinScreen;-
> doPost(Ljava/lang/String; Ljava/lang/String;)Z
[access_flags=private]
# # # # # # # # # # Parâmetros
doPost-BB@0x4 :
2 (00000004) nova instância v3, Ljava/net/URL;
Capítulo 4-Revisando a segurança do aplicativo 97
Primeiro você vê algumas informações básicas sobre como a Dalvik VM deve lidar com
a alocação de objetos para este método, juntamente com alguns identificadores para o
próprio método. Na desmontagem real que se segue, a instanciação de objetos como
java.net.HttpURLConnectione invocação desse objetoconectarmétodo
confirme o uso doINTERNETpermissão.
Você pode obter uma versão mais legível desse método descompilando-o, que retorna
uma saída que efetivamente se assemelha à fonte Java, chamandofontenesse mesmo
método de destino:
Em [39]: d.CLASS_Lcom_yougetitback_androidapplication_ConfirmPinScreen.
METHOD_doPost.source()
private boolean doPost(String p11, String p12)
{
98 Capítulo 4-Revisando a segurança do aplicativo
['com.yougetitback.androidapplication.ReportSplashScreen',
'com.yougetitback.androidapplication.SecurityQuestionScreen',
'com.yougetitback.androidapplication.SplashScreen',
'com.yougetitback.androidapplication.MenuScreen',
...
'com.yougetitback.androidapplication.settings.setting.Setting',
'com.yougetitback.androidapplication.ModifyPinScreen',
'com.yougetitback.androidapplication.ConfirmPinScreen',
Capítulo 4-Revisando a segurança do aplicativo 99
'com.yougetitback.androidapplication.EnterRegistrationCodeScreen',
...
Em [88]: a.get_main_activity()
Out[88]: u'com.yougetitback.androidapplication.ActivateSplashScreen'
Em [113]: a.get_services()
Fora[113]:
['com.yougetitback.androidapplication.DeleteSmsService',
'com.yougetitback.androidapplication.FindLocationService',
'com.yougetitback.androidapplication.PostLocationService', . . .
'com.yougetitback.androidapplication.LockAcknowledgeService',
'com.yougetitback.androidapplication.ContactBackupService',
'com.yougetitback.androidapplication.ContactRestoreService',
'com.yougetitback.androidapplication.UnlockService',
'com.yougetitback.androidapplication.PingService',
'com.yougetitback.androidapplication.UnlockAcknowledgeService', . . .
'com.yougetitback.androidapplication.wipe.MyService', . . .
Em [115]: a.get_receivers()
Fora[115]:
['com.yougetitback.androidapplication.settings.main.Entrance$MyAdmin',
'com.yougetitback.androidapplication.MyStartupIntentReceiver',
'com.yougetitback.androidapplication.SmsIntentReceiver',
'com.yougetitback.androidapplication.IdleTimeout',
'com.yougetitback.androidapplication.PingTimeout',
'com.yougetitback.androidapplication.RestTimeout',
'com.yougetitback.androidapplication.SplashTimeout',
'com.yougetitback.androidapplication.EmergencyTimeout',
'com.yougetitback.androidapplication.OutgoingCallReceiver',
'com.yougetitback.androidapplication.IncomingCallReceiver',
'com.yougetitback.androidapplication.IncomingCallReceiver',
'com.yougetitback.androidapplication.NetworkStateChangedReceiver',
'com.yougetitback.androidapplication.C2DMReceiver']
Com certeza, você encontra um Broadcast Receiver que parece estar relacionado ao
processamento de mensagens SMS, provavelmente para comunicações fora de banda, como bloqueio
100 Capítulo 4-Revisando a segurança do aplicativo
</intent-filter>
</receptor>
...
Para receptores de transmissão, oao receberserve como um ponto de entrada, para que você
possa procurar referências cruzadas ourefexpara resumir, a partir desse método para ter uma
ideia do fluxo de controle. Primeiro crie as refexs comd.create_xrefe depois ligue
show_xrefno objeto que representa oao recebermétodo:
Em [206]: d.create_xref()
Em [207]: d.CLASS_Lcom_yougetitback_androidapplication_SmsIntentReceiver.
METHOD_onReceive.show_xref()
# # # # # # # # # # XREF
T: Lcom/yougetitback/androidapplication/SmsIntentReceiver; isValidMessage (Ljava/lang/String;
Landroid/content/Context;)Z 6c T: Lcom/yougetitback/androidapplication/SmsIntentReceiver;
processContent (Landroid/content/Context; Ljava/lang/String;)V 78 T: Lcom/yougetitback/
androidapplication/SmsIntentReceiver; triggerAppLaunch (Landroid/conteúdo/Contexto; Landroid/
telefonia/SmsMessage;) V 9a
T: Lcom/yougetitback/androidapplication/SmsIntentReceiver;
getMessagesFromIntent (Landroid/content/Intent;) [Landroid/telefonia/
SmsMessage; 2a
T: Lcom/yougetitback/androidapplication/SmsIntentReceiver; isPinLock (Ljava/lang/String;
Landroid/content/Context;)Z 8a
###################
Você viu issoao receberchama alguns outros métodos, incluindo aqueles que
parecem validar a mensagem SMS e analisar o conteúdo. Descompile e investigue
alguns deles, começando comgetMessageFromIntent:
Em [213]: d.CLASS_Lcom_yougetitback_androidapplication_SmsIntentReceiver.
METHOD_getMessagesFromIntent.source()
private android.telephony.SmsMessage[]
getMessagesFromIntent(android.content.Intent p9)
{
v6 = 0;
v0 = p9.getExtras();
if (v0 != 0) {
v4 = v0.get("pdus");
v5 = new android.telephony.SmsMessage[v4.length]; v3 = 0;
}
v6 = v5;
}
retornar v6;
}
Este é um código bastante típico para extrair um SMS Protocol Data Unit (PDU) de
um Intent. Você vê que o parâmetrop9para este método contém o objeto Intent.v0é
preenchido com o resultado dep9.getExtras,que inclui todos os objetos extras no
Intent. Próximo,v0.get("pdus")é chamado para extrair apenas a matriz de bytes da PDU,
que é colocada emv4. O método então cria umMensagem SMSobjeto dev4, atribui av5,
e faz um loop enquanto preenche membros dev5. Finalmente, no que pode parecer
uma abordagem estranha (provavelmente devido ao processo de descompilação),v6
também é atribuído comoMensagem SMSobjetov5, e retornou ao chamador.
Descompilando oao recebermétodo, você vê que antes de chamar
getMessagesFromIntent,um arquivo de preferências compartilhadas,SuperheroPrefsFile,é
carregado. Neste caso, op8objeto, representando o aplicativoContextoou estado,
temgetSharedPreferencesinvocado. Depois disso, alguns métodos adicionais são
chamados para garantir que a mensagem SMS seja válida (isValidMessage),e,
finalmente, o conteúdo da mensagem é processado (processoConteúdo),todos
parecem receber op8objeto como parâmetro. É provável queSuperheroPrefsFile
contém algo relevante para as operações a seguir, como uma chave ou PIN:
Em [3]: d.CLASS_Lcom_yougetitback_androidapplication_SmsIntentReceiver.
METHOD_onReceive.source()
public void onReceive(android.content.Context p8,
android.content.Intent p9)
{
p8.getSharedPreferences("SuperheroPrefsFile", 0); if
(p9.getAction().equals("
android.provider.Telephony.SMS_RECEIVED") != 0) {
this.getMessagesFromIntent(p9); if (isto !=
0) {
v1 = 0;
while (v1 < this.length) {
if (this[v1] != 0) {
v2 = this[v1].getDisplayMessageBody(); if ((v2 != 0)
&& (v2.length() > 0)) {
android.util.Log.i("MessageListener:", v2);
this.isValidMessage(v2, p8);
if (isto == 0) {
this.isPinLock(v2, p8); if (isto !=
0) {
this.triggerAppLaunch(p8, this[v1]);
this.abortBroadcast();
}
} senão {
this.processContent(p8, v2);
this.abortBroadcast();
...
Capítulo 4-Revisando a segurança do aplicativo 103
Supondo que você queira construir uma mensagem SMS válida para ser processada
por este aplicativo, você provavelmente gostaria de dar uma olhada emisValidMessage,que
você vê no código anterior recebe uma string extraída da mensagem SMS via
getDisplayMessageBody,junto com o contexto atual do aplicativo. Descompilando
isValidMessagedá-lhe um pouco mais de visão sobre este aplicativo:
private boolean isValidMessage(String p12, android.content.Context p13)
{
v5 = p13.getString(1.82104701918e+38); v0 =
p13.getString(1,821047222e+38); v4 =
p13.getString(1.82104742483e+38); v3 =
p13.getString(1.82104762765e+38); v7 =
p13.getString(1.82104783048e+38); v1 =
p13.getString(1.8210480333e+38); v2 =
p13.getString(1.82104823612e+38); v6 =
p13.getString(1.82104864177e+38); v8 =
p13.getString(1.82104843895e+38);
this.getAction(p12);
if ((este.equals(v5) == 0) && ((este.equals(v4) == 0) && ((este.equals(v3) == 0)
&&
((this.equals(v0) == 0) && ((this.equals(v7) == 0) && ((this.equals(v6) == 0) &&
((this.equals(v2)) == 0) ) && ((este.igual(v8) == 0) && (este.igual(v1) == 0))))))))) {
v10 = 0;
} senão {
v10 = 1;
}
retornar v10;
}
A-há! O arquivo Shared Preferences aparece novamente. Este pequeno método chama
getStringpara obter o valor doalfineteentrada emSuperheroPrefsFile,e depois
compara isso comp6e retorna se a comparação foi verdadeira ou falsa. Se a
comparação fosse verdadeira,ao receberchamadastriggerAppLaunch.Descompilar
esse método pode aproximá-lo da compreensão de todo esse fluxo:
private void triggerAppLaunch(android.content.Context p9,
android.telephony.SmsMessage p10)
{
this.currentContext = p9;
v4 = p9.getSharedPreferences("SuperheroPrefsFile", 0); if
(v4.getBoolean("Ativado", 0) != 0) {
v1 = v4.edit();
v1.putBoolean("lockState", 1);
v1.putBoolean("smspinlock", 1);
v1.commit();
this.foregroundUI(p9);
v0 = p10.getOriginatingAddress();
v2 = new android.content.Intent("com.yougetitback.
androidapplication.FOREGROUND");
v2.setClass(p9, com.yougetitback.androidapplication.
FindLocationService);
v2.putExtra("LockSmsOriginator", v0);
p9.startService(v2);
this.startSiren(p9);
v3 = new android.content.Intent("com.yougetitback.
androidapplicationn.FOREGROUND");
v3.setClass(this.currentContext, com.yougetitback.
androidapplication.LockAcknowledgeService);
this.currentContext.startService(v3);
}
v11 = this.split(p17);
v10 = v11.elementAt(0);
if (p16.getSharedPreferences("SuperheroPrefsFile",
0).getBoolean("Ativado", 0) == 0) {
if (v10.igual(v5) != 0) {
this.processActivationMsg(p16, v11);
}
} senão {
if ((v10.igual(v6) == 0) && ((v10.igual(v5) == 0) &&
((v10.equals(v4) == 0) && ((v10.equals(v8) == 0) && ((v10.equals(v7) ==
0) && ((v10.equals(v3)) == 0 ) && (v10.igual(v1) == 0))))))) {
v10.igual(v2);
}
if (v10.igual(v6) == 0) {
if (v10.igual(v9) == 0) {
if (v10.igual(v5) == 0) {
if (v10.igual(v4) == 0) {
if (v10.igual(v1) == 0) { if
(v10.igual(v8) == 0) {
if (v10.igual(v7) == 0) {
if (v10.igual(v3) == 0) {
if (v10.igual(v2) != 0) {
this.processDeactivateMsg(p16,
v11);
}
} senão {
this.processFindMsg(p16, v11); }
} senão {
this.processResyncMsg(p16, v11);
}
} senão {
this.processUnLockMsg(p16, v11);
}
...
Em [1017]: d.CLASS_Lcom_yougetitback_androidapplication_
SmsIntentReceiver.METHOD_split.source()
java.util.Vector split(String p6)
{
v3 = new java.util.Vector(); v2 = 0;
Faz {
v1 = p6.indexOf(" ", v2);
106 Capítulo 4-Revisando a segurança do aplicativo
if (v1 < 0) {
v0 = p6.substring(v2);
} senão {
v0 = p6.substring(v2, v1);
}
v3.addElement(v0);
v2 = (v1 + 1);
} while(v1 != -1); retornar
v3;
}
Neste momento, sabemos que a mensagem SMS precisará conter “YGIB:U” para
potencialmente alcançarprocessUnLockMsg.Olhe para esse método para ver se há mais
alguma coisa que você precisa:
Em [1015]: d.CLASS_Lcom_yougetitback_androidapplication_
SmsIntentReceiver.METHOD_processUnLockMsg.source() private void
processUnLockMsg(android.content.Context p16, java.util.Vector p17)
{
...
v9 = p16.getSharedPreferences("SuperheroPrefsFile", 0); if (p17.size() >= 2) {
v1 = p17.elementAt(1);
if (v9.getString("tagcode", "") == 0) {
android.util.Log.v("SWIPEWIPE",
"mensagem de desbloqueio recebida");
com.yougetitback.androidapplication.wipe.WipeController.
stopWipeService(p16);
v7 = new android.content.Intent("com.yougetitback.
aplicativo android.FUNDO");
v7.setClass(p16, com.yougetitback.androidapplication.
Serviço de Primeiro Plano);
p16.stopService(v7);
v10 = new android.content.Intent("com.yougetitback.
aplicativo android.FUNDO");
v10.setClass(p16, com.yougetitback.androidapplication.
SirenService);
p16.stopService(v10);
v9.editar();
v6 = v9.edit();
v6.putBoolean("lockState", 0);
v6.putString("lockid", ""); v6.commit();
v5 = new android.content.Intent("com.yougetitback.
androidapplication.FOREGROUND");
v5.setClass(p16, com.yougetitback.androidapplication.
UnlockAcknowledgeService);
p16.startService(v5);
}
}
Retorna;
}
108 Capítulo 4-Revisando a segurança do aplicativo
Desta vez você vê que uma chave chamadacódigo de etiquetaé puxado doSuperheroPrefsFile
arquivo e, em seguida, uma série de serviços é interrompida (e outra iniciada), que você pode
assumir que desbloqueia o telefone. Isso não parece certo, pois implicaria que, desde que essa
chave existisse no arquivo de preferências compartilhadas, ela seria avaliada como verdadeira -
provavelmente é um erro do descompilador, então vamos verificar a desmontagem com
bonito_show:
Em [1025]: d.CLASS_Lcom_yougetitback_androidapplication_
SmsIntentReceiver.METHOD_processUnLockMsg.pretty_show() . . .
processUnLockMsg-BB@0x5e :
23 (0000005e) const/4 v13, 1
24 (00000060) move-object/from16 v0, v17
25 (00000064) invocar-virtual v0, v13,
Ljava/util/Vector;->elementAt(I)Ljava/lang/Object;
26 (0000006a) mover-resultado-objeto v1
27 (0000006c) check-cast v1, Ljava/lang/String;
28 (00000070) const-string v13, 'tagcode'
29 (00000074) const-string v14, ''
30 (00000078) interface de invocação v9, v13, v14,
Landroid/content/SharedPreferences;->getString( Ljava/lang/
String; Ljava/lang/String;) Ljava/lang/String;
processUnLockMsg-BB@0x94 :
37 (00000094) const-string 38 v13, 'SWIPEWIPE'
(00000098) const-string 39 v14, 'mensagem de desbloqueio
(0000009c) invocar-estático recebida' v13, v14, Landroid/util/Log;-
> v(Ljava/lang/String; Ljava/lang/String;)I 40 (000000a2) invoke-static/range
v16, Lcom/yougetitback/androidapplication/wipe/WipeController;
- > stopWipeService(Landroid/content/Context;)V
[ processUnLockMsg-BB@0xa8 ]
...
Análise dinâmica
A análise dinâmica envolve a execução do aplicativo, normalmente de forma instrumentada ou
monitorada, para obter informações mais concretas sobre seu comportamento. Isso
geralmente envolve tarefas como verificar os artefatos que o aplicativo deixa no sistema de
arquivos, observar o tráfego de rede, monitorar o comportamento do processo... todas as
coisas que ocorrem durante a execução. A análise dinâmica é ótima para verificar suposições ou
testar hipóteses.
As primeiras coisas a serem abordadas de um ponto de vista dinâmico são entender
como um usuário interagiria com o aplicativo. Qual é o fluxo de trabalho? Quais menus,
telas e painéis de configurações existem? Muito disso pode ser descoberto por meio de
análise estática – por exemplo, as atividades são facilmente identificáveis. No entanto,
entrar nos detalhes de sua funcionalidade pode ser demorado. Muitas vezes, é mais fácil
interagir diretamente com o aplicativo em execução.
Se você acenderlogcatao iniciar o aplicativo, você vê alguns nomes de atividades
familiares à medida que o ActivityManager gira o aplicativo:
I/ActivityManager( 245): START {act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER] flg=0x10200000
cmp=com.yougetitback.androidapplication.virgin.mobile/ com.yougetitback.androidapplication.
ActivateSplashScreen u=0} do pid 449 I/ActivityManager( 245): Iniciar proc
Movendo-se um pouco mais pelo aplicativo, você verá prompts para um PIN e uma pergunta de
segurança, conforme mostrado na Figura 4-6. Depois de fornecer essas informações, você verá uma
saída notável emlogcat.
Teste D/YGIB (2252): Contexto de—
> com.yougetitback.androidapplication.virgin.mobile I/
RequestConfigurationService( 2252): RequestConfigurationService criado!!!
cmp=com.yougetitback.androidapp
lication.virgin.mobile/
com.yougetitback.androidapplication.C2DMReceiver (tem extras) } I/Activity
{cmp=com.y on.virgin.mobile/
com.youget difyPinScreen u=0} do pid 2252
...
Com certeza, há chamadas sendo registradas para iniciar e interromper alguns dos serviços
observados anteriormente, juntamente com nomes de atividades familiares. Mais abaixo no log, no
entanto, você vê um vazamento de informações interessante:
$ adb jdwp
2252
Usandogreppara procurar esses mapas PID de acordo com nosso processo de destino (também
visto nos logs mostrados anteriormente):
Usando oAulascomando, junto com um nome de classe parcial, você pode ver quais
classes existem nocom.yougetitbacknamespace. Em seguida, usando ométodos
comando, descubra os métodos em uma determinada classe:
- - com.yougetitback.androidapplication.SmsIntentReceiver.
isPinLock(Ljava/lang/String;Landroid/content/Context;)Z
- - com.yougetitback.androidapplication.SmsIntentReceiver.
isValidMessage(Ljava/lang/String;Landroid/content/Context;)Z . . .
- - com.yougetitback.androidapplication.SmsIntentReceiver.
processUnLockMsg(Landroid/content/Context;Ljava/util/Vector;)V
com.yougetitback.androidapplication.SmsIntentReceiver
- - this=Lcom/yougetitback/androidapplication/SmsIntentReceiver;
<830007979232>
- - mensagem=Foobarbaz
- - com.yougetitback.androidapplication.SmsIntentReceiver.
isValidMessage(Ljava/lang/String;Landroid/content/Context;)Z:63
- - YGIBDEACTIVATE=YGIB:D
- - YGIBFIND=YGIB:F
- - context=Landroid/app/ReceiverRestrictedContext; <830007987072>
- - YGIBUNLOCK=YGIB:U
- - this=Lcom/yougetitback/androidapplication/SmsIntentReceiver;
<830007979232>
- - YGIBBACKUP=YGIB:B
- - YGIBRESYNC=YGIB:RS
- - YGIBLOCK=YGIB:L
- - YGIBWIPE=YGIB:W
- - YGIBRESTORE=YGIB:E
- - msg=Foobarbaz
- - YGIBREGFROM=YGIB:T
...
# # trace thread <1> main (corrida suspensa)
- - com.yougetitback.androidapplication.SmsIntentReceiver.isPinLock(
Ljava/lang/String;Landroid/content/Context;)Z:0
- - this=Lcom/yougetitback/androidapplication/SmsIntentReceiver;
<830007979232>
- - msg=Foobarbaz
- - context=Landroid/app/ReceiverRestrictedContext; <830007987072>
...
processContent(Landroid/conteúdo/Contexto;Ljava/lang/String;)V:232
- - YGIBDEACTIVATE=YGIB:D
- - YGIBFIND=YGIB:F
- - context=Landroid/app/ReceiverRestrictedContext; <830007987072>
- - YGIBUNLOCK=YGIB:U
- - this=Lcom/yougetitback/androidapplication/SmsIntentReceiver;
<830008303000>
- - configurações=Landroid/app/ContextImpl$SharedPreferencesImpl;
<830007888144>
- - m=YGIB:U
- - YGIBBACKUP=YGIB:B
- - YGIBRESYNC=YGIB:RS
- - YGIBLOCK=YGIB:L
- - messageTokens=Ljava/util/Vector; <830008239000>
- - YGIBWIPE=YGIB:W
- - YGIBRESTORE=YGIB:E
- - comando=YGIB:U
- - YGIBREGFROM=YGIB:T
Você sabe pela análise anterior quegetStringserá chamado para recuperar algum
valor do arquivo Shared Preferences, então adicione umrastreamento de classeno
android.content.SharedPreferencesclasse. Em seguida, retome o processo com
aretomarcomando:
> > ct android.content.SharedPreferences
# # Configurando Ganchos
- - android.content.SharedPreferences enganchado
> > currículo
Capítulo 4-Revisando a segurança do aplicativo 117
Depois que o processo for retomado, a saída será bastante detalhada (como
antes). Percorrendo mais uma vez a pilha de chamadas, você acabará chegando ao
getStringmétodo:
# # Processo retomado
> > # # trace thread <1> main (corrida suspensa)
...
# # trace thread <1> main (corrida suspensa)
- - android.app.SharedPreferencesImpl.getString(Ljava/lang/String;
Ljava/lang/String;)Ljava/lang/String;:0
- - this=Landroid/app/SharedPreferencesImpl; <830042611544>
- - defValue=
- - key=tagcode
- - com.yougetitback.androidapplication.SmsIntentReceiver.
processUnLockMsg(Landroid/content/Context;Ljava/util/Vector;)V:60
- - smsTokens=Ljava/util/Vector; <830042967248>
- - configurações=Landroid/app/SharedPreferencesImpl; <830042611544>
- - this=Lcom/yougetitback/androidapplication/SmsIntentReceiver;
<830042981888>
- - TIPOLOCO=L
- - YGIBTAG=TAG:
- - TAG=AAAA
- - YGIBTYPE=TYPE:
- - context=Landroid/app/ReceiverRestrictedContext; <830042704872>
- - configuração=
...
Ataque
Embora você pudesse simplesmente enviar sua mensagem SMS especialmente criada
para o dispositivo de destino, você ainda estaria sem sorte em simplesmente saber o
código de etiquetavalor se for diferente para algum outro dispositivo, talvez arbitrário (o que
é praticamente garantido). Para esse fim, você deseja aproveitar o valor vazado no log,
que pode ser obtido em seu aplicativo de prova de conceito solicitando o
READ_LOGSpermissão.