Jump to content
dariusmare

[SURSA] Cum am luat 200/200 la olimpiada de informatica fara sa fac vreo problema

Recommended Posts

Posted (edited)

Anul trecut am fost la olimpiada de informatica si chiar inainte de olimpiada m-am gandit ca sigur au un evaluator care verifica problemele. Asa ca am intrat pe siteul local al sectiunii de informatica si am gasit un server ftp de unde am reusit sa iau evaluatorul. Dupa ce l-am decompilat, am facut un cod universal care pus la orice problema va da punctaj maxim.

  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <string>
  6. #include <sstream>
  7. #define BUFFER_SIZE 18
  8.  
  9. using namespace std;
  10.  
  11. bool isMatch(const string& lFile,const string&rFile)
  12. {
  13.     ifstream lFileStream(lFile.c_str(), ifstream::in | ios::binary);
  14.     ifstream rFileStream(rFile.c_str(),ifstream::in | ios::binary);
  15.  
  16.     if(!lFileStream.is_open() || !rFileStream.is_open())
  17.     {
  18.         return false;
  19.     }
  20.  
  21.     char* lData = new char[BUFFER_SIZE]();
  22.     char* rData = new char[BUFFER_SIZE]();
  23.  
  24.     do{
  25.         lFileStream.read(lData, BUFFER_SIZE);
  26.         rFileStream.read(rData, BUFFER_SIZE);
  27.  
  28.         if(memcmp(lData,rData,BUFFER_SIZE)!=0)
  29.         {
  30.             delete[] lData;
  31.             delete[] rData;
  32.             return false;
  33.         }
  34.     }while(lFileStream.good() || rFileStream.good());
  35.     delete[] lData;
  36.     delete[] rData;
  37.     return true;
  38.  
  39. }
  40.  
  41. int main()
  42. {
  43.     stringstream path;
  44.     path << "..\\probleme\\numeproblema\\teste\\";
  45.     const int kTests = 20;
  46.     for(int i=0;i<=kTests;i++)
  47.     {
  48.         stringstream current;
  49.         current << path.str() << i <<"-numeproblema.in";
  50.         cout << current.str() <<endl;
  51.         if(isMatch("numeproblema.in", current.str()))
  52.         {
  53.             stringstream out;
  54.             out << path.str() << i << "-numeproblema.ok";
  55.             ofstream fout("numeproblema.out", ios::binary);
  56.             ifstream file((out.str()).c_str(),ios::binary);
  57.             fout << file.rdbuf();
  58.         }
  59.     }
  60.     return 0;
  61. }
Edited by dariusmare
  • Upvote 23
  • Downvote 1
Posted
10 minutes ago, dariusmare said:

Anul trecut am fost la olimpiada de informatica si chiar inainte de olimpiada m-am gandit ca sigur au un evaluator care verifica problemele. Asa ca am intrat pe siteul local al sectiunii de informatica si am gasit un server ftp de unde am reusit sa iau evaluatorul. Dupa ce l-am decompilat, am facut un cod universal care pus la orice problema va da punctaj maxim.

  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <string>
  6. #include <sstream>
  7. #define BUFFER_SIZE 18
  8.  
  9. using namespace std;
  10.  
  11. bool isMatch(const string& lFile,const string&rFile)
  12. {
  13.     ifstream lFileStream(lFile.c_str(), ifstream::in | ios::binary);
  14.     ifstream rFileStream(rFile.c_str(),ifstream::in | ios::binary);
  15.  
  16.     if(!lFileStream.is_open() || !rFileStream.is_open())
  17.     {
  18.         return false;
  19.     }
  20.  
  21.     char* lData = new char[BUFFER_SIZE]();
  22.     char* rData = new char[BUFFER_SIZE]();
  23.  
  24.     do{
  25.         lFileStream.read(lData, BUFFER_SIZE);
  26.         rFileStream.read(rData, BUFFER_SIZE);
  27.  
  28.         if(memcmp(lData,rData,BUFFER_SIZE)!=0)
  29.         {
  30.             delete[] lData;
  31.             delete[] rData;
  32.             return false;
  33.         }
  34.     }while(lFileStream.good() || rFileStream.good());
  35.     delete[] lData;
  36.     delete[] rData;
  37.     return true;
  38.  
  39. }
  40.  
  41. int main()
  42. {
  43.     stringstream path;
  44.     path << "..\\probleme\\numeproblema\\teste\\";
  45.     const int kTests = 20;
  46.     for(int i=0;i<=kTests;i++)
  47.     {
  48.         stringstream current;
  49.         current << path.str() << i <<"-numeproblema.in";
  50.         cout << current.str() <<endl;
  51.         if(isMatch("numeproblema.in", current.str()))
  52.         {
  53.             stringstream out;
  54.             out << path.str() << i << "-numeproblema.ok";
  55.             ofstream fout("numeproblema.out", ios::binary);
  56.             ifstream file((out.str()).c_str(),ios::binary);
  57.             fout << file.rdbuf();
  58.         }
  59.     }
  60.     return 0;
  61. }

 

Meritai 201 puncte pentru că ai gândit out of the box. Bravo!

  • Upvote 3
Posted
Just now, dariusmare said:

@Silviu asta am zis si eu, ei nu au fost de acord cu mine, "frauda" au zis.


Conform legii și regulamentelor se poate spune că ai trișat, deoarece nu a fost tocmai o soluție etică. Dar altfel, se poate considera o soluție unică și sigur ai face diferența la un interviu sau cineva te-ar remarca pentru asta. 
Bine, cel mai ok era să testezi și să anunți vulnerabilitatea, iar mai apoi să rezolvi tu problemele fără a recurge la trick-uri. Consider-o o victorie pe partea de gândire și logică.

  • Upvote 1
Posted (edited)

Toata lumea stia ca se poate asta.

Cam toti concurentii stiu cum se testeaza, si ca in fisierele cu terminatia ".ok" este rezultatul corect, insa in regulament se interzice clar ce ai facut tu (eg:sa copiezi din fisierul .ok in .out), de asta nici nu se pune accentul pe securitate:

http://olimpiada.info/oji2015/RegSpecific.pdf (pagina 6)

 

Concurenţilor li se interzice ca în programele lor:

 

  • să folosească biblioteci externe. Prin bibliotecă externă se înţelege oricare bibliotecă care nu e parte a Bibliotecii Standard C++ (exemplu: subprograme din CRT sau conio.h);
  •  să solicite introducerea altor date decât cele specificate în enunţul problemei. De exemplu, programul nu trebuie să se încheie cu readln, readkey, getch(), etc. (solicitând astfel comisiei tastarea unor caractere). Programul va aştepta inutil introducerea acestor date şi va depăşi timpul de executare specificat în enunţul problemei; 
  • să acceseze reţeaua;
  • să atace securitatea oricărui calculator din reţea sau a sistemului de evaluatorului;
  • să acceseze alte fișiere decât cele specificate în enunţul problemei;
  • să utilizeze tehnici de programare cu scopul de a bloca compilarea sursei (de exemplu: instanţieri, template recursive);

Nu trebuia sa treci nici de faza locala (daca ai trecut) cu un program care copiaza continutul unui fisier...

 

Si cu decompilatul, si FTP... de ce? Evaluatorul se gaseste la o simpla cautare pe Google, iar in help-ul programului se explica cum functioneaza si care este path-ul fisierelor .ok, nu era nevoie de nicio "decompilare"

Edited by EstiBun
Posted (edited)

Comisia m-a intrebat cine m-a invatat si ca nu a mai fost nimeni care a facut asta ?? Eu nu am stitu de existenta niciunui regulament, nu am fost pus sa semnez si nici un mi s-a confirmat ca prin participare accept regulemanteul lor. Eu am facut aceasta chestia la faza locala. Te rog gaseste regulament inainte de oji 2015 cand am folosit eu.

Edited by dariusmare
Posted
Just now, dariusmare said:

Comisia m-a intrebat cine m-a invatat si ca nu a mai fost nimeni care a facut asta ?? Eu nu am stitu de existenta niciunui regulament, nu am fost pus sa semnez si nici un mi s-a confirmat ca prin participare accept regulemanteul lor.

La ce faza era?

Posted (edited)

Well, nu cred ca exista competitie fara regulament. Si cam la nicio competitie nu semnezi nimic, insa dreptul de participare este pierdut prin incalcarea regulamentului. Pai nu la OJI 2015 ai participat? Ai scris ca "anul trecut" ai participat. Regulamentul postat este de anul trecut, pentru toate etapele competitiei.

 

Nu a fost nimeni care a facut asta, pentru ca cei pe care ii duce capu stiu ca e interzis de regulament. Nu cred ca se pune problema sa nu stie cineva care participa la olimpiada sa nu stie sa copieze un fisier.

 

 

Edited by EstiBun
Posted (edited)
46 minutes ago, EstiBun said:

Well, nu cred ca exista competitie fara regulament. Si cam la nicio competitie nu semnezi nimic, insa dreptul de participare este pierdut prin incalcarea regulamentului. Pai nu la OJI 2015 ai participat? Ai scris ca "anul trecut" ai participat.

Nu a fost nimeni care a facut asta, pentru ca cei pe care ii duce capu stiu ca e interzis de regulament. Nu cred ca se pune problema sa nu stie cineva care participa la olimpiada sa nu stie sa copieze un fisier.

 

 

 

Well, in caz ca exista cineva care nu stia chestia asta, acum le-am aratat. Eu am facut asta la OLI 2015  si am fost descalificat. Si NASA spue clar : "Nu aveti voie sa ne intrati in sistemele de securitate". Asta inseamna ca nu le pasa de securitate pentru ca au "mentionat" ei ca nu e voie ? Mai lasa-ma cu abureliele astea. Daca e olimpiada de informatica si nu sunt in stare sa faca un soft secure, problema lor. Si te asigur ca nu sunt multi care stiu cum sa copieze un fisier.

 

Si ca sa mai stii ceva, comisia a zis ca nu au stiut de asta si au "securizat" evaluatorul.

 

LE: Si am decompilat ca sa gasesc aceste 2 functii si am vrut sa imi dau 201 puncte facand method hooking sau ceva detouring dar am renuntat

private void WriteTempRezults(string iD, string test, string points, string time, string memory, string msg)
private void InsertListView(string testNumber, string points, string time, string memory, string msg)

pentru ca scopul meu nu a fost sa trec mai departe fraudulos ci sa le arat eroarea pentru ca altfel nu ma bagau in seama.

Edited by dariusmare
misspeling
  • Upvote 4
Posted (edited)

Doua chestii:

 

1. Considerand ca suntem pe un forum de securitate, cred ca e bine de clarificat ca ai dat dovada de un stil de gandire specific filozofiei de hacking, ceea ce e de apreciat. Nu cred ca e cineva aici care contesta asta. E adevarat ca hack-ul in sine nu e foarte complicat, dar faptul ca ti-ai imaginat un vector de atac, ai stiut cum sa gasesti ce ai nevoie ca sa confirmi ideea, si apoi ai implementat o solutie (cu un cod suficient de elegant, zic eu, daca ai pune si niste spatii pe langa parantezele alea ar arata si mai bine), e o mica dovada ca stii sa gandesti in felul asta, si daca te intereseaza sa continui in domeniul asta, si cu ceva efort depus in a intelege diversele stackuri de tehnologie care se folosesc pe web, o sa faci hackuri din ce in ce mai interesante.

 

2. Faptul ca ai fost descalificat de la olimpiada e absolut normal, si era de asteptat. Nu-mi dau seama din mesajele tale daca intelegi asta sau nu, dar vreau sa fiu clar: ce ai facut, pe langa faptul ca e clar impotriva regulilor (pe care nu ai voie sa zici ca nu le cunosteai, e o aparare copilareasca), e si impotriva spiritului olimpiadelor. Acolo lumea concureaza in a rezolva o problema specifica, scopul este in a descoperi cine are abilitatea sa inteleaga problema respectiva si sa gaseasca solutia optima. Scopul nu e punctajul. E ca si cum la un maraton, dupa ce s-a dat startul, iei masina pana la finish line si apoi te astepti sa fii felicitat. That's not the point. Faptul ca tu ai putea sa ai pretentia sa fii evaluat dupa aceleasi metrici ca solutiile la problema adevarata e impotriva spiritului competitiei si e lipsit de respect pentru ceilalti concurenti, si daca nu intelegi asta iti recomand sa insisti in a incerca sa intelegi, pentru ca e un aspect important in multe lucruri din viata.

Edited by andreigheorghe
clarificare
  • Upvote 6

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...