Second writeup du CSAW CTF ! Le reverse Linux à 400 pt.
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) :
- int __cdecl main(int argc, char **argv)
- {
- unsigned int v2; // eax@7
- int result; // eax@11
- char v4; // [sp+23h] [bp-4Dh]@3
- char v5; // [sp+24h] [bp-4Ch]@8
- char v6; // [sp+25h] [bp-4Bh]@9
- char v7; // [sp+26h] [bp-4Ah]@9
- char v8; // [sp+27h] [bp-49h]@9
- char v9; // [sp+28h] [bp-48h]@9
- char v10; // [sp+29h] [bp-47h]@9
- char v11; // [sp+2Ah] [bp-46h]@9
- char v12; // [sp+2Bh] [bp-45h]@9
- char v13; // [sp+2Ch] [bp-44h]@9
- char v14; // [sp+2Dh] [bp-43h]@9
- char v15; // [sp+2Eh] [bp-42h]@9
- char v16; // [sp+2Fh] [bp-41h]@9
- char v17; // [sp+30h] [bp-40h]@9
- char v18; // [sp+31h] [bp-3Fh]@9
- char v19; // [sp+32h] [bp-3Eh]@9
- char v20; // [sp+33h] [bp-3Dh]@9
- char v21; // [sp+34h] [bp-3Ch]@9
- char v22; // [sp+35h] [bp-3Bh]@9
- char v23; // [sp+36h] [bp-3Ah]@9
- char v24; // [sp+37h] [bp-39h]@9
- char v25; // [sp+38h] [bp-38h]@9
- char v26; // [sp+39h] [bp-37h]@9
- char v27; // [sp+3Ah] [bp-36h]@9
- char v28; // [sp+3Bh] [bp-35h]@9
- char v29; // [sp+3Ch] [bp-34h]@9
- char v30; // [sp+3Dh] [bp-33h]@9
- char v31; // [sp+3Eh] [bp-32h]@9
- char buffer; // [sp+40h] [bp-30h]@2
- int v33; // [sp+5Ch] [bp-14h]@1
- v33 = *MK_FP(__GS__, 20);
- if ( argc <= 1 )
- {
- v4 = 0;
- encode_key(&buffer, &v4);
- }
- else
- {
- encode_key(&buffer, argv[1]);
- }
- if ( argc == 3 )
- {
- strncpy(&buffer, argv[2], 0x1Bu);
- decode_key(&buffer);
- }
- else
- {
- if ( strcmp(argv[3], "I want to speak to a customer service representative.") )
- {
- decode_key(&buffer);
- }
- else
- {
- v2 = 0;
- do
- {
- *(_DWORD *)(&v5 + v2) = 0;
- v2 += 4;
- }
- while ( v2 < 0x1C );
- v5 = 55;
- v6 = 49;
- v7 = 69;
- v8 = 71;
- v9 = -17;
- v10 = -17;
- v11 = 67;
- v12 = -2;
- v13 = 55;
- v14 = 55;
- v15 = 42;
- v16 = 63;
- v17 = 51;
- v18 = 44;
- v19 = -4;
- v20 = 42;
- v21 = 66;
- v22 = 44;
- v23 = 62;
- v24 = 42;
- v25 = -2;
- v26 = 44;
- v27 = -17;
- v28 = 68;
- v29 = -18;
- v30 = -18;
- v31 = 72;
- decode_key(&v5);
- }
- }
- result = 0;
- if ( *MK_FP(__GS__, 20) != v33 )
- __stack_chk_fail();
- return result;
- }
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 :
- #include <stdio.h>
- 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";
- int main(int argc, char **argv){
- int v1, i;
- for(i=0; i<=26; i++){
- if (i > 6) v1 = -53;
- else v1 = -52;
- }
- return 0;
- }
On obtient ce résultat : key{##w3ll_tha1_was_3a$y##}
Aucun commentaire:
Enregistrer un commentaire