Selbstgeschriebenes Cryptukh: Verwundbar aufgrund des Designs oder der Historie einer CTF-Aufgabe

Verfasser: Innokenty Sennovsky (rumata888)



Wie kann man einen Studenten fĂŒr ein langweiliges Fach interessieren? Geben Sie dem Lernen eine Form des Spielens. Vor langer Zeit hat sich jemand ein solches Sicherheitsspiel ausgedacht - Capture the Flag oder CTF. Daher waren faule SchĂŒler mehr daran interessiert zu lernen, wie man Programme umkehrt, wo es besser ist, AnfĂŒhrungszeichen einzufĂŒgen und warum proprietĂ€re VerschlĂŒsselung wie ein Sprung auf einen Rechen mit einem laufenden Start ist.



Die SchĂŒler sind erwachsen geworden, und jetzt nehmen erfahrene Fachleute mit Kindern und Hypotheken an diesen "Spielen" teil. Sie haben viel gesehen, daher ist es keine leichte Aufgabe, eine Aufgabe fĂŒr die CTF zu erledigen, damit die „alten Leute“ nicht jammern.



Und wenn Sie es mit Hardcore ĂŒbertreiben, werden die Teams, die diesen nicht zum Kern gehörenden Themenbereich oder die erste ernsthafte CTF haben, gesprengt.



In diesem Artikel werde ich Ihnen erzĂ€hlen, wie unser Team ein Gleichgewicht zwischen "hmm, etwas Neues" und "das ist eine Art Dose" gefunden hat, wĂ€hrend es die Krypta-Aufgabe fĂŒr das CTFZone-Finale in diesem Jahr entwickelte.



Endanzeige CTFZone 2020



Endanzeige CTFZone 2020



Inhalt



  1. Optionale EinfĂŒhrung: CTF in 2 Minuten erklĂ€ren
  2. Wie haben wir verstanden, dass wir eine Krypta brauchen?
  3. Wie wir den Stapel gewÀhlt haben


  4. 4.1. .

    4.2. .


  5. 5.1. :

    5.2. :

    5.3.


: CTF 2



, CTF, — . , CTF- .



: jeopardy attack-defense.



jeopardy . «Jeopardy!», « ». , . , «» . , .



attack-defense (AD) . , — . : attack-defense -10 -20 jeopardy.



AD vulnboxes — , . vulnboxes . — , (checker). , .



, — , . , 5 . . vulnbox , .



, :



  • vulnbox;
  • ,  ;
  • , .


- CTF, , :



  • web,
  • pwn,
  • misc,
  • PPC,
  • forensic,
  • reverse,
  • crypto ( , ).


, , jeopardy. , AD . «» , - , CTFZone.



,



CTFZone, , AD.



, AD, , . , . , .



, . . , nonce ECDSA, , .



, . - AD- , . , : . , , .



, ( ), . , .



, , CTF . — .



, , . , ? :)





, , Python. , .



, DEF CON , Python + C ( , ). C, Python , .



, , , .





, , CTF, — Zero Knowledge Proofs of Knowledge (ZKPoK), . , , - , . ZKPoK : - , . .



.



. . . — , .



, , . , , .



— . , . , .






.



. , , , , , . , 4 : A, B, C, D. A B, C D.



:

Matrix



, , .



, , : , ABCD → BADC. (): B→A→D→C→B.






. . . , — . :



Matrix



, . .



, . , , .



— :



Adjazenzmatrix



, (x, y) (y, x), B D.



.



:



  • - , . ;
  • , , .


, , (Prover), (Verifier).



0. . , : A→B→C→D→A. , , (. . ) . ( ) .



Matrixmultiplikation und Transposition



, . — .



1. . , (commitment). , , : , — , . , , .



:



  1. . ;
  2. . , . : .


2. . , (challenge) b∈{0,1} . , ( b=0) ( b=1) .



, , — .



3. . , , , , . , , , .



, , . , , .



. , b. b, : b=0, , b=1, . b, . , - ( , ).



, , , 50- , , . , . . , . 25%, — 12,5% . . , .



.



P.S. Zero Knowledge, - Zero Knowledge Proofs: An illustrated primer. .





. « » = «», « » = «», « » = « ».



:



, , . , , , . :



  • ;
  • ;
  • 16- RANDOMR, ;
  • RSA- .


RANDOMR , .



, : , DoS- . PKCS#1 v1.5. , , 3 (Bleichenbacher's e=3 signature attack). , 3 (, SAFE_VERSION macro ):



 uint8_t* badPKCSUnpadHash(uint8_t* pDecryptedSignature, uint32_t dsSize){
    uint32_t i;
    if (dsSize<MIN_PKCS_SIG_SIZE) return NULL;
    if ((pDecryptedSignature[0]!=0)||(pDecryptedSignature[1]!=1))return NULL;
    i=2;
    while ((i<dsSize) && (pDecryptedSignature[i]==0xff)) i=i+1;
    if (i==2 || i>=dsSize) return NULL;
    if (pDecryptedSignature[i]!=0) return NULL;
    i=i+1;
    if ((i>=dsSize)||((dsSize-i)<SHA256_SIZE)) return NULL;
    #ifdef SAFE_VERSION
    //Check that there are no bytes left, apart from hash itself
    //(We presume that the caller did not truncate the signature afte exponentiation
    // and the dsSize is the equal to modulus size in bytes
    if ((dsSize-i)!=SHA256_SIZE) return NULL;
    #endif
    return pDecryptedSignature+i;
}


30 :



  • ;
  • , ;
  • , .


, .



. , , . , , .



:



, , .



— Python + C. C, 95% . Python . . (, void_p ctypes. 64- 32 ).



Python :



verifier=Verifier(4,4,7)


:



  1. .
  2. .
  3. .


.



. , , , : .



, 256. :



  • -, , 2 ( , ). , 5 , .
  • -, , .


. , , - . 116. .



, , 64, 1264. — .



, — .



. , 3 , :



  • , "" CRC32;
  • , SHA-256;
  • , AES-128 CBC.


1−7, . : CRC32, SHA-256, AES. , CRC32 AES, CRC32.



, :



  1. ( ).
  2. .
  3. , 1. proof_count.
  4. ( proof_count).
  5. , .
  6. , , .
  7. 3.


. (, ). . (simulation mode), . . . , , , . , . , ,



. .



CRC32 SHA-256 , . , (uint16_t), , 8 . , , -. :



Hash(Pack(permutation))|Hash(Pack(permuted_graph))|Hash(Pack(permuted_cycle))



. b, , . , , . , , .



AES, : K1 K2. , , K1 K2. :



Enc(Pack(permutation),K1)|Enc(Pack(permuted_cycle),K2)|Pack(permuted_graph)



b Kb. .



, , AES, ( , , ). , SHA-256, ( ), - , .



CRC32, , , . CRC32 232. Meet-in-the-Middle (« »), 217.

: , . . MitM , .. .



Meet-in-the-Middle , CRC32. ,



y=CRC32(x0)



x1 ,



CRC32(x1)=y



x1, 6 ( ). CRC32 :



  1. Init.
  2. ti+1=Round(ti,bi), (ti — , bi — ).
  3. Finish.


, 6 :



CRC326(x)=Finish(Round(Round(Round(Round(Round(Round(Init(),b1),b2),b3),b4),b5),b6))



t:

Produkt der Funktionen von t

CRC326 :



CRC326=CRC32FH∗CRC32SH





CRC32FH=Init∗Roundb1∗Roundb2∗Roundb3



CRC32SH=Roundb4∗Roundb5∗Roundb6∗Finish



CRC32 . , Roundbi Finish , CRC32SH :



CRC32SH_INV=CRC32SH−1



CRC326 :



  1. 217 CRC32FH b1b2b3 -, b1b2b3 .
  2. CRC32SH_INV(y) b4b5b6. , -. , . 1216−1215.
  3. : t=CRC32FH(b1,b2,b3)=CRC32SH_INV(y,b6,b5,b4), , y=CRC32(b1b2b3b4b5b6), .


: « , , , — , , ». — , . , :



SIZE(2 bytes) | PACKED_DATA



, HASHES — , , size2 packed_data, . , 6 :



SIZE(2 bytes) | PACKED_DATA | e1 | e2 | e3 | e4 | e5 | e6



, CRC32FH



SIZE(2 bytes) | PACKED_DATA | e1 | e2 | e3



CRC32SH_INV



e4 | e5 | e6



.





4 . . , , — (PRNG ).



C rand, - . Legendre PRF, .



, , GF(p), - p. , . , (p−1)2 ( 0) .



- , 0, , , 12. , ( — r≠0) . . r rp−12=1 mod p, . r 50%, , .



a∈GF(p). Python :



def LegendrePRNG(a,p):
    if a==0:
        a+=1
    while True:
        next_bit=pow(a,(p-1)//2,p)
        if next_bit==1:
            yield 1
        else:
            yield 0
        a=(a+1)%p
        if a==0:
            a+=1


32- p, Meet-in-the-Middle. , 216+31 , . , 216 32- , 32 . , — big-endian little-endian, — .



, . Legendre PRNG. a=1 32 . , (, ).



, a=1+216 . a 216 , . , , . a , — . , , .



, , . , . , .



, :



  1. Bleichenbacher’s e=3.
  2. .
  3. .
  4. CRC32.
  5. .




, .



, , , . - Linux Usermode Kernel CryptoAPI .



, : . SIMD, . , , : . .



, M P. Mp, : Mp=PT⋅M⋅P. — . 1, 0. . Pâ€Č Mâ€Č, R=Pâ€Č⋅Mâ€Č.



, . , , 1 , :



  1. Pâ€Č.
  2. 1, , j.
  3. j- Mâ€Č R.
  4. .


:



Beispiel



Pâ€Č (, ) .



Matrix



, . Mâ€Č R.



Matrix



Pâ€Č. .



Matrix



, Mâ€Č .



Matrix



.



EndgĂŒltige Matrix



, 1 , , j- . , memcpy , SIMD, memcpy . .



- . Zero Knowledge , Python, PEM. , , , .





, .



24 , , . CryptoAPI: AF_ALG, .



, - . .



, , .



, , . , pwn :)



, :



  • -, C , . ASAN (Address Sanitizer), .
  • -, , , . , . Libfuzzer , .

    : . /dev/urandom randrand, ( Legendre PRF, ) srand(0). , . - AES- .

    , . , .


, , . , , — : , , .





Legendre PRNG . , . , .



Proof of Knowledge, . , , . , :



  1. . , . - , SLA ( ).
  2. , , . . . - , SLA.
  3. . . , , , . , , . SLA.


(Bushwhackers) SLA 65%, . , scoreboard, .





, , . .



, , . , , . , .



, https://github.com/bi-zone/CTFZone-2020-Finals-LittleKnowledge. , . , ( ) . . , , . , - CTF.



, , !




All Articles