User Tools

Site Tools


tajni_chat

Tajni chat

Zastavica će se ispisati ako vrijedi uvjet (status→odobren && status→moze_citati_flag). Potrebno je preplaviti status i postaviti ga na ispravne vrijednosti. Jedini unos je preko scanf-a:

scanf("%10s",popis_pozivatelja[i].ime);
scanf("%10s",popis_pozivatelja[i].kontakt);

Objekt status nalazi se iza popis_pozivatelja. Unos scanf-a ograničen je iteracijom po broju pozivatelja:

for(long long i=0; i<broj_pozivatelja; i++)
...

Također postavljan je uvjet na donju granicu broja pozivatelja:

if(broj_pozivatelja > 0) //Dakle broj pozivatelja ne smije biti negativan

Potrebno je napraviti overflow na način da iteracija omogućuje veći ispis po gomili od veličine popis_pozivatelja:

long long broj_pozivatelja; //qword (8 bajtova/64 bita)

2^64 = 18,446,744,073,709,551,616 različitih vrijednosti:

  • U unsigned notaciji: [0, 18 446 744 073 709 551 615]
  • U signed notaciji : [-9 223 372 036 854 775 808, 9 223 372 036 854 775 807]

Veličina popis_pozivatelja je određena s:

broj_pozivatelja * sizeof(struct pozivatelj)

Sizeof je operacija koja vraća tip size_t (unsigned int) i u ovom slučaju to će biti vrijednost 20 (10 char + 10 char gdje je char riječ definirana kao byte) Broj_pozivatelja je long long Rezultat množenja je tip long long (implicit casting - uvijek se upcasta na najkompleksniji operand u operaciji npr. float*long *int *short = float).

Kako bi se izveo overflow na razini registra koji čuva vrijednost umnoška potrebno je unijeti vrijednost za broj_pozivatelja na načina da je rezultat veći od 2^64 jer:

Broj_pozivatelja*sizeof(struct pozivatelj) = (broj_pozivatelja*sizeof (struct pozivatelj) ) % 2^64 = (broj_pozivatelja*20)%2^64

2^64 / 20 =  922337203685477581 kada se zaokruži na gornju granicu. Time je ostatak 4 unutar malloc-a. Naravno, moguće je izvesti overflow i s drukčijim brojevima.


Rješenje je dakle:

  1. Unos_1: 922337203685477581
  2. Unos_2: Unos stringa do adrese status i preplavljivanje varijable moze_citati_flag

tajni_chat.txt · Last modified: 2023/11/15 17:44 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki