XCTFmobile 之 fácil de lo que escribir hasta

simulador arrastrado es una caja de validación, dirigimos la jeb:

Llamar al método nativo public static int nativo CheckString (String arg0), si la verificación retornos consistentes 1, de lo contrario, devuelve 0.

Después de apk de descompresión de cambio de nombre de cremallera, en los archivos del directorio lib .so arrastrados a la AIF, encontrar el CheckString función, el código es el siguiente:

_BOOL4 __cdecl Java_com_testjava_jack_pingan2_cyberpeace_CheckString(int a1, int a2, int a3)
{
  const char *v3; // ST1C_4
  size_t v4; // edi
  char *v5; // esi
  size_t v6; // edi
  char v7; // al
  char v8; // al
  size_t v9; // edi
  char v10; // al

  v3 = (const char *)(*(int (__cdecl **)(int, int, _DWORD))(*(_DWORD *)a1 + 676))(a1, a3, 0);
  v4 = strlen(v3);
  v5 = (char *)malloc(v4 + 1);
  memset(&v5[v4], 0, v4 != -1);
  memcpy(v5, v3, v4);
  if ( strlen(v5) >= 2 )
  {
    v6 = 0;
    do
    {
      v7 = v5[v6];
      v5[v6] = v5[v6 + 16];
      v5[v6++ + 16] = v7;
    }
    while ( v6 < strlen(v5) >> 1 );
  }
  v8 = *v5;
  if ( *v5 )
  {
    *v5 = v5[1];
    v5[1] = v8;
    if ( strlen(v5) >= 3 )
    {
      v9 = 2;
      do
      {
        v10 = v5[v9];
        v5[v9] = v5[v9 + 1];
        v5[v9 + 1] = v10;
        v9 += 2;
      }
      while ( v9 < strlen(v5) );
    }
  }
  return strcmp(v5, "f72c5a36569418a20907b55be5bf95ad") == 0;
}

Nos atrevemos a especular const char * v3 se pasa en una cadena, a continuación, una por una lógica de análisis de código:

v4 = strlen(v3);              //取变量v4=v3的字符串长度,假设v3="abcd",v4=4
v5 = (char *)malloc(v4 + 1);  //为字符指针v5请求一块长度为v4+1的内存空间
memset(&v5[v4], 0, v4 != -1); //将v5扩增一倍并后面扩增的部分初始化为0,此行代码结束,v5=----0000
memcpy(v5, v3, v4);           //将v3的内容复制到v5中
if ( strlen(v5) >= 2 )        //若v5的长度大于等于2则执行花括号内的内容
  {
    v6 = 0;             //初始化v6=0
    do                  //执行循环
    {
      v7 = v5[v6];     //从第0个开始读取v5的每个字符
      v5[v6] = v5[v6 + 16];   //逐个将v5的第v6个字符与第v6+16个字符交换位置
      v5[v6++ + 16] = v7;     //v6自增1
    }
    while ( v6 < strlen(v5) >> 1 );
  }

Después de la cadena de entrada se asume ABCD, a continuación, el código anterior es acabada CDAB v5

Continuar analizando el siguiente código:

v8 = *v5;      //指针v8指向v5
  if ( *v5 )      //v5存在,执行花括号内的逻辑
  {   
    *v5 = v5[1];    
    v5[1] = v8;
    if ( strlen(v5) >= 3 ) //v5的长度大于等于3
    {
      v9 = 2;         //初始化v9=2
      do
      {
        v10 = v5[v9];   
        v5[v9] = v5[v9 + 1];
        v5[v9 + 1] = v10;
        v9 += 2;
      }
      while ( v9 < strlen(v5) );
    }
  }

Este código es muy simple intercambio veintidós.

Obtener la bandera de código de acuerdo con el manual directo que arriba:

1. El intercambio f72c5a36569418a20907b55be5bf95ad veintidós 7fc2a5636549812a90705bb55efb59da obtenida

2. 7fc2a5636549812a90705bb55efb59da cortados de la media, empalmado al extremo de la cabeza, para dar 90705bb55efb59da7fc2a5636549812a

3. Añadir la bandera {} es la bandera.

 

Publicados 118 artículos originales · ganado elogios 38 · vistas 120 000 +

Supongo que te gusta

Origin blog.csdn.net/shuaicenglou3032/article/details/104427184
Recomendado
Clasificación