Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ////////////////////////////////////////////////////////////////////////////////
- // Fichier: overflow.c
- // Hacker: Samuel Duclos
- // License: This program is 3-clause BSD licensed.
- // Date: Jeudi, le 14 janvier 2016.
- // Instructions pour reproduire:
- // 1) Ecrire ABCD… en entree dans le UART du debogueur pour
- // calculer l'adresse de retour d'execution qui sera
- // utilisee comme nouveau Program Counter lors d'un crash
- // controle avec un breakpoint et quelques steps into (F11).
- // 2) Si l'adresse de system_access() n'est pas du ASCII valide, recrire quelques instructions inutiles pour qu'elles prennent une autre adresse.
- // 3) strcpy() est inutile pour l’overflow.
- // 4) ALT-xxx pour les caracteres non-accessibles.
- //
- ////////////////////////////////////////////////////////////////////////////////
- #include “MonDallas.h”
- #include <stdio.h> // puts(), getchar().
- // http://www.keil.com/support/man/docs/c51/c51_puts.htm
- #include <string.h> // strcpy(), strcmp().
- // http://www.keil.com/support/man/docs/c51/c51_strcpy.htm
- // http://www.keil.com/support/man/docs/c51/c51_strcmp.htm
- // J’ai “oublie” mon mot de passe par
- // hasard mais on s'en fout…
- // const specifie que la valeur est fixe.
- const char password[8] = “UNKNOWN”;
- char buffer2[8]; // <- Buffer trop petit.
- // Fonction qui se fout de la taille des tampons.
- void UARTgetline(char *string);
- // Fonction qu'on ne “peut pas” acceder.
- void system_access(void);
- // Simule une interruption systeme par
- // un element exterieur au programme.
- void system_interrupt(void) reentrant;
- void main(void) {
- SCON0 = 0x50;
- TMOD |= 0x20;
- TH1 = 0xFF;
- PCON = 0x80;
- TR1 = 1;
- TI_0 = 1;
- system_interrupt();
- }
- // Prend le input du clavier.
- void UARTgetline(char *string) {
- char i = 0;
- // Ne verifie pas le nombre de caracteres pris en input.
- do { string[i] = getchar();
- } while (string[i++] != ‘\n’);
- // Transforme le buffer en chaine de caracteres.
- string[i] = ‘\0’;
- }
- void system_access(void) {
- while (1) {
- puts(“Access granted!”);
- puts(buffer2);
- }
- }
- void system_interrupt(void) reentrant {
- char buffer1[32]; // Buffer trop gros.
- while (1) {
- UARTgetline(buffer1);
- // Copie buffer1 dans buffer2.
- // Voir documentation (liens en haut).
- strcpy(buffer2, buffer1);
- // Compare buffer2 avec password.
- // Retourne 0 s'ils sont egaux.
- if (strcmp(buffer2, password) == 0) {
- // Pas suppose se rendre la.
- system_access();
- }
- // puts() ne prend pas 1k de memoire
- // pour le programme comme printf().
- puts(“Access denied!”);
- puts(buffer2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement