Reverse Engineering la picoCTF 2019: Vault Doors
- 3 minute de citit
- 6 exemple de cod în Java
Disponibil și în English
Pe această pagină
Întotdeauna ajung târziu la petrecere, dar iată soluțiile mele pentru provocările Vault Doors din secțiunea de reverse engineering a PicoCTF2019. Le-am făcut în principal ca să-mi îmbunătățesc abilitățile și, sper, ca să învăț lucruri noi.
vault-door-training – Puncte: 50
Misiunea ta este să intri în laboratorul lui Dr. Evil și să recuperezi schemele Proiectului său Doomsday. Laboratorul este protejat de o serie de uși de seif blocate. Fiecare ușă este controlată de un calculator și necesită o parolă pentru a se deschide. Din nefericire, agenții noștri sub acoperire nu au reușit să obțină parolele secrete ale ușilor de seif, dar unul dintre agenții noștri juniori a obținut codul sursă al calculatorului fiecărui seif! Va trebui să citești codul sursă al fiecărui nivel ca să afli care este parola pentru ușa respectivă. Ca antrenament, am creat un seif replică în centrul nostru de instruire. Codul sursă al seifului de antrenament este aici: VaultDoorTraining.java
Parola se află în codul sursă. O poți copia/lipi și o poți pune în formatul picoCTF{flag}.
public boolean checkPassword(String password) { return password.equals("w4rm1ng_Up_w1tH_jAv4_3b500738c12"); }vault-door-1 – Puncte: 100
A doua provocare este la fel ca prima, dar va trebui să reordonezi vectorul. Asociază fiecare comparație de caractere cu indexul din vector și vei obține ceva de genul:
d35cr4mbl3_tH3_cH4r4cT3r5_03f841
vault-door-3 – Puncte: 200
A treia provocare folosește bucle și vectori ca să construiască parola. Putem să o rezolvăm dând programului date de test și observând cum le modifică:
String s = new String(buffer); System.out.print("s: " + s); //in jU5t_a_s01234567 89abcdefghijklmn //ou: jU5t_a_s76543210 m9kbidgfehcjal8n // jU5t_a_sna_3lpm1 3gc49_u_4_m0rf41 //s: jU5t_a_s1mpl3_an4gr4m_4_u_90cf31 return s.equals("jU5t_a_sna_3lpm13gc49_u_4_m0rf41"); } public static void main(String[] args) { boolean result = checkPassword("jU5t_a_s0123456789abcdefghijklmn"); System.out.print("nDone: " + result); }vault-door-4 – Puncte: 250
A patra provocare de seif este și mai ușoară: tot ce trebuie să faci este să convertești numere din baze diferite înapoi în caractere ASCII. Folosește convertoare de numere online.
byte[] myBytes = { 106 , 85 , 53 , 116 , 95 , 52 , 95 , 98 , // ascii: jU5t_4_b 0x55, 0x6e, 0x43, 0x68, 0x5f, 0x30, 0x66, 0x5f, // hex: UnCh_0f_ 0142, 0131, 0164, 063 , 0163, 0137, 063 , 0141, // octal: bYt3s_3a '7' , '2' , '4' , 'c' , '8' , 'f' , '9' , '2' , // characters: 724c8f92 // jU5t_4_bUnCh_0f_bYt3s_3a724c8f92 };vault-door-5 – Puncte: 300
Această provocare are parola codificată mai întâi URL Encode și apoi Base64 Encode; ca s-o rezolvi, trebuie doar s-o decodezi. Poți face asta folosind CyberChef.
public boolean checkPassword(String password) { String urlEncoded = urlEncode(password.getBytes()); String base64Encoded = base64Encode(urlEncoded.getBytes()); String expected = "JTYzJTMwJTZlJTc2JTMzJTcyJTc0JTMxJTZlJTY3JTVm" + "JTY2JTcyJTMwJTZkJTVmJTYyJTYxJTM1JTY1JTVmJTM2" + "JTM0JTVmJTMxJTMxJTM3JTM3JTY2JTM3JTM4JTMz"; return base64Encoded.equals(expected); }vault-door-6 – Puncte: 350
Această provocare folosește o schemă de criptare XOR; o putem învinge folosind CyberChef sau modificând codul și rulându-l ca să scoată parola:
public void checkPassword() { byte[] myBytes = { 0x3b, 0x65, 0x21, 0xa , 0x38, 0x0 , 0x36, 0x1d, 0xa , 0x3d, 0x61, 0x27, 0x11, 0x66, 0x27, 0xa , 0x21, 0x1d, 0x61, 0x3b, 0xa , 0x2d, 0x65, 0x27, 0xa , 0x60, 0x62, 0x36, 0x67, 0x6d, 0x6c, 0x67, }; for (int i=0; i<32; i++) { System.out.print( (char) (myBytes[i] ^ 0x55) ); } }vault-door-7 – Puncte: 400
Ca să rezolv această provocare, am folosit acest convertor Binar în Zecimal ca să obțin valorile hexazecimale, apoi am folosit CyberChef ca să le conving înapoi în ASCII.
vault-door-8 – Puncte: 450
Ultima provocare poate fi rezolvată inversând pașii funcției de amestecare (scramble); restul rămâne neschimbat. Apoi o rulăm dând funcției de amestecare modificate octeții așteptați.
public char[] scramble(String i) { /* Amestecă o parolă prin transpunerea perechilor de biți. */ char[] a = i.toCharArray(); for (int b = 0; b < a.length; b++) { char c = a[b]; c = switchBits(c, 6, 7); c = switchBits(c, 2, 5); c = switchBits(c, 3, 4); c = switchBits(c, 0, 1); c = switchBits(c, 4, 7); c = switchBits(c, 5, 6); c = switchBits(c, 0, 3); c = switchBits(c, 1, 2); a[b] = c; } return a; }// Va trebui să trimiți vectorul așteptat funcției scramble pentru dezamestecare: System.out.println("Expected " + String.valueOf(expected)); System.out.println("Scrambled " + String.valueOf(scramble(String.valueOf(expected))));Atât! Sper că ți-a plăcut.