Pour commencer, on va quand même saluer le petit calembour entre le SMIC et le RSA, c’est le premier jeu de mots que vous verrez sur l’ensemble du challenge. Nous pouvons saluer l’imagination du créateur.
Théorie
Parfait pour se mettre en jambe, le RSA est un grand classique des CTF de part sa facilité de compréhension et sa complexité technique. Tout repose sur des propriétés mathématique à la fois simples et complexes, cet oxymore définie à lui seul pourquoi cet algorithme de chiffrement est toujours dans l’air du temps. Tout se joue sur la factorisation du modulus n, car s’il n’est pas assez grand, l’ensemble s’effondre.
Pour plus d’informations, je vous conseil la lecture de cet article Wikipedia .
C’est parti !
Lisons ce qui nous est demandé, nous devons produire le message chiffré “c” qui correspond aux informations données, d’ailleurs, quelles sont ces informations ?
nous avons en notre possession:
- le “message” à chiffrer (m): 29092715682136811148741896992216382887663205723233009270907036164616385404410946789697601633832261873953783070225717396137755866976801871184236363551686364362312702985660271388900637527644505521559662128091418418029535347788018938016105431888876506254626085450904980887492319714444847439547681555866496873380
- la clef publique (n): 115835143529011985466946897371659768942707075251385995517214050122410566973563965811168663559614636580713282451012293945169200873869218782362296940822448735543079113463384249819134147369806470560382457164633045830912243978622870542174381898756721599280783431283777436949655777218920351233463535926738440504017
- l’exposant (e) : 65537 (ou 0x10001 en hexadecimal, je me souviens mieux de cette notation)
Si vous avez bien lu la page Wikipedia, vous avez trouvé que pour produire le message chiffré (c), il faut faire le calcul suivant:
c = m^e.mod(n)
Je suis désolé, je n’ai pas trouvé comment formater le texte pour produire de belles équations mathématique.
Exploit.py
Allons y, dans notre éditeur de texte préféré (gVim par exemple si vous êtes sous windows, ou encore l’excellent Visual Studio Code) nous allons créer l’exploit suivant:
m = 29092715682136811148741896992216382887663205723233009270907036164616385404410946789697601633832261873953783070225717396137755866976801871184236363551686364362312702985660271388900637527644505521559662128091418418029535347788018938016105431888876506254626085450904980887492319714444847439547681555866496873380
n = 115835143529011985466946897371659768942707075251385995517214050122410566973563965811168663559614636580713282451012293945169200873869218782362296940822448735543079113463384249819134147369806470560382457164633045830912243978622870542174381898756721599280783431283777436949655777218920351233463535926738440504017
e = 0x10001
try:
c = pow(m,e,n)
print("[*] Flag is : FCSC{%s}" % c)
except:
print("[*] Sorry, better luck next time")
input()
En python, si vous passez trois arguments dans la méthode pow(), il va faire exactement ce dont nous avons besoin, pourquoi faire compliqué quand on peut faire simple ?
Nous avons ensuite un formatage de sortie de texte FCSC{%s} qui va récupérer la sortie contenue dans (c) et l’afficher sur notre écran.
Le code pour moi était le suivant:
Conclusion
Rien de particulier sur cet exercice, nous restons sur des propriétés mathématique de base, mais ayez confiance, le suivant sera plus ardu, mais parole de chaton, il restera réalisable !