Affichage des articles dont le libellé est 400. Afficher tous les articles
Affichage des articles dont le libellé est 400. Afficher tous les articles

lundi 26 septembre 2011

CTF Quals CSAW 2011 - Reversing Linux

Salut à tous !

Second writeup du CSAW CTF ! Le reverse Linux à 400 pt.
  1. What ?

    On nous fournit un binaire linux "a.out" que vous pouvez retrouver sur shell-storm ici On go IDA et son pote HexRay.
    On obtient ce code (aprés quelques nettoyages ... ou pas) :

    1. int __cdecl main(int argc, char **argv)
    2. {
    3.   unsigned int v2; // eax@7
    4.   int result; // eax@11
    5.   char v4; // [sp+23h] [bp-4Dh]@3
    6.   char v5; // [sp+24h] [bp-4Ch]@8
    7.   char v6; // [sp+25h] [bp-4Bh]@9
    8.   char v7; // [sp+26h] [bp-4Ah]@9
    9.   char v8; // [sp+27h] [bp-49h]@9
    10.   char v9; // [sp+28h] [bp-48h]@9
    11.   char v10; // [sp+29h] [bp-47h]@9
    12.   char v11; // [sp+2Ah] [bp-46h]@9
    13.   char v12; // [sp+2Bh] [bp-45h]@9
    14.   char v13; // [sp+2Ch] [bp-44h]@9
    15.   char v14; // [sp+2Dh] [bp-43h]@9
    16.   char v15; // [sp+2Eh] [bp-42h]@9
    17.   char v16; // [sp+2Fh] [bp-41h]@9
    18.   char v17; // [sp+30h] [bp-40h]@9
    19.   char v18; // [sp+31h] [bp-3Fh]@9
    20.   char v19; // [sp+32h] [bp-3Eh]@9
    21.   char v20; // [sp+33h] [bp-3Dh]@9
    22.   char v21; // [sp+34h] [bp-3Ch]@9
    23.   char v22; // [sp+35h] [bp-3Bh]@9
    24.   char v23; // [sp+36h] [bp-3Ah]@9
    25.   char v24; // [sp+37h] [bp-39h]@9
    26.   char v25; // [sp+38h] [bp-38h]@9
    27.   char v26; // [sp+39h] [bp-37h]@9
    28.   char v27; // [sp+3Ah] [bp-36h]@9
    29.   char v28; // [sp+3Bh] [bp-35h]@9
    30.   char v29; // [sp+3Ch] [bp-34h]@9
    31.   char v30; // [sp+3Dh] [bp-33h]@9
    32.   char v31; // [sp+3Eh] [bp-32h]@9
    33.   char buffer; // [sp+40h] [bp-30h]@2
    34.   int v33; // [sp+5Ch] [bp-14h]@1
    35.  
    36.   v33 = *MK_FP(__GS__, 20);
    37.   if ( argc <= 1 )
    38.   {
    39.     v4 = 0;
    40.     encode_key(&buffer, &v4);
    41.   }
    42.   else
    43.   {
    44.     encode_key(&buffer, argv[1]);
    45.   }
    46.   if ( argc == 3 )
    47.   {
    48.     strncpy(&buffer, argv[2], 0x1Bu);
    49.     decode_key(&buffer);
    50.   }
    51.   else
    52.   {
    53.     if ( strcmp(argv[3], "I want to speak to a customer service representative.") )
    54.     {
    55.       decode_key(&buffer);
    56.     }
    57.     else
    58.     {
    59.       v2 = 0;
    60.       do
    61.       {
    62.         *(_DWORD *)(&v5 + v2) = 0;
    63.         v2 += 4;
    64.       }
    65.       while ( v2 < 0x1C );
    66.       v5 = 55;
    67.       v6 = 49;
    68.       v7 = 69;
    69.       v8 = 71;
    70.       v9 = -17;
    71.       v10 = -17;
    72.       v11 = 67;
    73.       v12 = -2;
    74.       v13 = 55;
    75.       v14 = 55;
    76.       v15 = 42;
    77.       v16 = 63;
    78.       v17 = 51;
    79.       v18 = 44;
    80.       v19 = -4;
    81.       v20 = 42;
    82.       v21 = 66;
    83.       v22 = 44;
    84.       v23 = 62;
    85.       v24 = 42;
    86.       v25 = -2;
    87.       v26 = 44;
    88.       v27 = -17;
    89.       v28 = 68;
    90.       v29 = -18;
    91.       v30 = -18;
    92.       v31 = 72;
    93.       decode_key(&v5);
    94.     }
    95.   }
    96.   result = 0;
    97.   if ( *MK_FP(__GS__, 20) != v33 )
    98.     __stack_chk_fail();
    99.   return result;
    100. }
    101.  

    Les v4 à v31 sont enf ait les octets d'un buffer. On voit rien de spécial excepté dans le cas ou argc est différent de 3 et que le strcmp ne correspond pas.
    Peut importe comment on y arrive (si on peut y arriver), on voit qu'il set les octets du buffer puis le décode.
    Décodons ce petit buffer !
    On a juste a copier les octets, la fonction de décodage, puis de regarder le résultat :)
    On obtient ce code :

    1. #include <stdio.h>
    2.  
    3. char* data = "\x37\x31\x45\x47\xEF\xEF\x43\xFE\x37\x37\x2A\x3F\x33\x2C\xFC\x2A\x42\x2C\x3E\x2A\xFE\x2C\xEF\x44\xEE\xEE\x48";
    4.  
    5. int main(int argc, char **argv){
    6.     int v1, i;
    7.     for(i=0; i<=26; i++){
    8.         if (i > 6) v1 = -53;
    9.         else v1 = -52;
    10.         printf("%c", (char)(data[i]-v1));
    11.     }
    12.     printf("\n");
    13.     return 0;
    14. }

    On obtient ce résultat : key{##w3ll_tha1_was_3a$y##}