Advertisement
bsddeamon

overflow0.c

Jan 26th, 2016
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.66 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Fichier: overflow.c
  3. // Hacker: Samuel Duclos
  4. // License: This program is 3-clause BSD licensed.
  5. // Date: Jeudi, le 14 janvier 2016.
  6. // Instructions pour reproduire:
  7. // 1) Ecrire ABCD… en entree dans le UART du debogueur pour
  8. // calculer l'adresse de retour d'execution qui sera
  9. // utilisee comme nouveau Program Counter lors d'un crash
  10. // controle avec un breakpoint et quelques steps into (F11).
  11. // 2) Si l'adresse de system_access() n'est pas du ASCII valide, recrire quelques instructions inutiles pour qu'elles prennent une autre adresse.
  12. // 3) strcpy() est inutile pour l’overflow.
  13. // 4) ALT-xxx pour les caracteres non-accessibles.
  14. //
  15. ////////////////////////////////////////////////////////////////////////////////
  16.  
  17. #include “MonDallas.h”
  18. #include <stdio.h> // puts(), getchar().
  19. // http://www.keil.com/support/man/docs/c51/c51_puts.htm
  20.  
  21. #include <string.h> // strcpy(), strcmp().
  22. // http://www.keil.com/support/man/docs/c51/c51_strcpy.htm
  23. // http://www.keil.com/support/man/docs/c51/c51_strcmp.htm
  24.  
  25. // J’ai “oublie” mon mot de passe par
  26. // hasard mais on s'en fout…
  27. // const specifie que la valeur est fixe.
  28. const char password[8] = “UNKNOWN”;
  29. char buffer2[8]; // <- Buffer trop petit.
  30.  
  31. // Fonction qui se fout de la taille des tampons.
  32. void UARTgetline(char *string);
  33.  
  34. // Fonction qu'on ne “peut pas” acceder.
  35. void system_access(void);
  36.  
  37. // Simule une interruption systeme par
  38. // un element exterieur au programme.
  39. void system_interrupt(void) reentrant;
  40.  
  41. void main(void) {
  42.   SCON0 = 0x50;
  43.   TMOD |= 0x20;
  44.   TH1 = 0xFF;
  45.   PCON = 0x80;
  46.   TR1 = 1;
  47.   TI_0 = 1;
  48.  
  49.   system_interrupt();
  50. }
  51.  
  52. // Prend le input du clavier.
  53. void UARTgetline(char *string) {
  54.   char i = 0;
  55.  
  56.   // Ne verifie pas le nombre de caracteres pris en input.
  57.   do { string[i] = getchar();
  58.   } while (string[i++] != ‘\n’);
  59.  
  60.   // Transforme le buffer en chaine de caracteres.
  61.   string[i] = ‘\0;
  62. }
  63.  
  64. void system_access(void) {
  65.   while (1) {
  66.     puts(“Access granted!);
  67.     puts(buffer2);
  68.   }
  69. }
  70.  
  71. void system_interrupt(void) reentrant {
  72.   char buffer1[32]; // Buffer trop gros.
  73.   while (1) {
  74.     UARTgetline(buffer1);
  75.  
  76.     // Copie buffer1 dans buffer2.
  77.     // Voir documentation (liens en haut).
  78.     strcpy(buffer2, buffer1);
  79.  
  80.     // Compare buffer2 avec password.
  81.     // Retourne 0 s'ils sont egaux.
  82.     if (strcmp(buffer2, password) == 0) {
  83.  
  84.       // Pas suppose se rendre la.
  85.       system_access();
  86.     }
  87.  
  88.     // puts() ne prend pas 1k de memoire
  89.     // pour le programme comme printf().
  90.     puts(“Access denied!);
  91.     puts(buffer2);
  92.   }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement