Auteur: Innokenty Sennovsky (rumata888)
Comment intéresser un étudiant à un sujet ennuyeux? Donnez à l'apprentissage une forme de jeu. Il y a assez longtemps, quelqu'un a inventé un tel jeu de sécurité - Capture the Flag, ou CTF. Les étudiants paresseux étaient donc plus intéressés à apprendre à inverser les programmes, où il est préférable d'insérer des guillemets et pourquoi le cryptage propriétaire est comme sauter sur un râteau avec un démarrage en cours.
Les étudiants ont grandi, et maintenant des professionnels expérimentés avec des enfants et des hypothèques participent à ces «jeux». Ils ont vu beaucoup de choses, alors confier une tâche à la FCE pour que les «vieux» ne se plaignent pas n'est pas une tâche facile.
Et si vous en faites trop avec le hardcore, les équipes qui ont ce domaine secondaire ou le premier CTF sérieux seront foudroyées.
Dans cet article, je vais vous dire comment notre équipe a trouvé un équilibre entre «hmm, quelque chose de nouveau» et «c'est une sorte d'étain», en développant la tâche de cryptage pour les finales CTFZone cette année.
Tableau de bord final CTFZone 2020
Contenu
- Introduction facultative: expliquer le CTF en 2 minutes
- Comment avons-nous compris que nous avions besoin d'une crypte
- Comment nous avons choisi la pile
-
4.1. .
4.2. . -
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.
:
, , .
, , : , ABCD → BADC. (): B→A→D→C→B.
. . . , — . :
, . .
, . , , .
— :
, (x, y) (y, x), B D.
.
:
- - , . ;
- , , .
, , (Prover), (Verifier).
0. . , : A→B→C→D→A. , , (. . ) . ( ) .
, . — .
1. . , (commitment). , , : , — , . , , .
:
- . ;
- . , . : .
2. . , (challenge) . , ( ) ( ) .
, , — .
3. . , , , , . , , , .
, , . , , .
. , . , : , , , . , . , - ( , ).
, , , 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)
:
- .
- .
- .
.
. , , , : .
, 256. :
- -, , 2 ( , ). , 5 , .
- -, , .
. , , - . . .
, , 64, . — .
, — .
. , 3 , :
- , "" CRC32;
- , SHA-256;
- , AES-128 CBC.
, . : CRC32, SHA-256, AES. , CRC32 AES, CRC32.
, :
- ( ).
- .
- , 1. proof_count.
- ( proof_count).
- , .
- , , .
- 3.
. (, ). . (simulation mode), . . . , , , . , . , ,
. .
CRC32 SHA-256 , . , (uint16_t), , 8 . , , -. :
. , , . , , . , , .
AES, : . , , . :
. .
, , AES, ( , , ). , SHA-256, ( ), - , .
CRC32, , , . CRC32 . Meet-in-the-Middle (« »), .
: , . . MitM , .. .
Meet-in-the-Middle , CRC32. ,
,
, 6 ( ). CRC32 :
- .
- , ( — , — ).
- .
, 6 :
:
:
CRC32 . , , :
:
- -, .
- . , -. , . .
- : , , , .
: « , , , — , , ». — , . , :
, HASHES — , , , . , 6 :
,
.
4 . . , , — (PRNG ).
C rand, - . Legendre PRF, .
, , , - . , . , ( 0) .
- , , , , . , ( — ) . . , . 50%, , .
. 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- , Meet-in-the-Middle. , , . , 32- , 32 . , — big-endian little-endian, — .
, . Legendre PRNG. 32 . , (, ).
, . , . , , . , — . , , .
, , . , . , .
, :
- Bleichenbacher’s e=3.
- .
- .
- CRC32.
- .
, .
, , , . - Linux Usermode Kernel CryptoAPI .
, : . SIMD, . , , : . .
, . , : . — . , . . , .
, . , , , :
- .
- , , .
- - .
- .
:
(, ) .
, . .
. .
, .
.
, , , - . , 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, . , , . , :
- . , . - , SLA ( ).
- , , . . . - , SLA.
- . . , , , . , , . SLA.
(Bushwhackers) SLA 65%, . , scoreboard, .
, , . .
, , . , , . , .
, https://github.com/bi-zone/CTFZone-2020-Finals-LittleKnowledge. , . , ( ) . . , , . , - CTF.
, , !