
hadanka c.4 - najdi heslo
tak a znova ma hackli. chcel som byt poriadny geek a urobil som si autentifikaciu v jazyku C. myslel som, ze som zvolil celkom dobre heslo:
if (strcmp(buffer, "123") == 0)
, ale asi moc dobre nebolo. ok, vsak som nejaky geek, tak som si dal total brutal neprelomitelne heslo a napisal som si na stranku: teraz ma hacknite vy loseri! a tesil som sa, ako som im to nandal.
na druhy den som bol znovu hacknuty a napisali mi: you are lamer!. este mi napisali cosi ako BFU alebo BOF alebo BAF, uz si presne napamatam, tak ma to rozrusilo. takze, ak by ste mi mohli pomoct, ako sa im to podarilo, bol by som velmi vdacny.
tu je kod:
#include <string.h>
#include <stdio.h>
char testuj_udaje(char* heslo)
{
// char* hash="_y66v!**";
char je_heslo_OK = 'N';
char buffer[15];
strcpy(buffer, heslo);
if (strcmp(buffer, "*******************") == 0)
je_heslo_OK = 'A';
return je_heslo_OK;
}
int main(int argc, char* argv[])
{
if (argc<2) {
printf("musis zadat heslo, sklerotik!\n");
return 1;
}
if (testuj_udaje(argv[1]) == 'A')
printf("OK, vstup pane\n");
else
printf("koho chces hackovat, loser?\n");
return 0;
}
otestovat heslo si mozte tu: level4.php
a binarka na testovanie je tu: heslo.zip
hall of fame je tu: halloffame.php
Zrejme to nie je multiplatformové?
tato hadanka nemoze byt multiplatformova a ani pre jednu platformu nemusi mat rovnake vysledky, takze ostatni toto mate ako prvy hint.

Veď ani nemá, spustil som to a o chvíľu sa mi zrútil Windows.
Alebo to zariadil TDX.EXE, ktorý odmietol spolupracovať. Žiaľ nespolupracuje ani TD.EXE. Terminated code 1 a výstup je: "This program can not be run in DOS mode."


zrejme tato hadanka je pre teba prilis tazka.
Princíp som už pochopil, len neviem ako to tam dostať.
Ak si pochopil princip tak dalsi hint je: alignment
vie narobit problemy aj v beznom zivote, napr. ak naivny programator (ako ja ked som studoval
) uklada obsah struktury o viac premennych do suboru tak ako je (binarne), vsetko funguje len dovtedy kym si niekto tie zdrojaky prelozi napr. 64bit prekladacom na 64bit masine (vtedy to bola u mna DEC Alpha), tak ma ten program zrazu problem precitat datove subory, ktore ten isty program (len prelozeny inym prekladacom) vytvoril u mna doma na 32bit PC 
On ten svina alignment
Áno už som sa tým začal zaoberať. Ešte som nad tým v robote rozmýšľal a zaplo mi, že toto je konzolová aplikácia pre Windows, takže to bude trochu inak. Stále som to prepočítaval podľa DOSu. Ale toto mi tiež veľmi nepomohlo (toto moje zistenie), nakoľko netuším ako si to rozhadzuje Windows, takže ešte musím porozmýšľať.
zkus se v tom kodu zamerit na radek
a deklarace prmennych
Veď ja viem, o čo tam ide. Len neviem, ako to je uložené. Pre mňa za mňa tu napíšem presný popis a potom to bude vedieť už pomaly každý alebo to ešte predtým nejaký moderátor vymaže, aby to nebol hint pre ostatných.
Edit: V krátkosti len toľko, že keby podporoval jazyk C direktívu $S z Turbo Pascalu, tak pri zadaní hesla by sme skončili s hlásením Runtime errror 202 (to je akože z Turbo Pascalu).
Kdyz vis tak presny popis, tak proc jeste nejsi v HOF?
Tu je teda popis (ak moderátori chcú nech to vymažú):
Pri kopírovaní reťazca dojde k pretečeniu cez pole znakov, teda vlastne pretečie zásobník a prepíšu sa obsahy smerníkov. Tým dojde k "presmerovaniu smerníkov" a teda vlastne už bude v premennej, ktorá má obsahovať "N" zmenený obsah na "A". Len dočerta neviem ako to poprehadzovať, aby som prepísal správne smerník.
da sa povedat, ze je ti to jasne ale k ziadnemu presmerovaniu smernikov nedojde a ani neviem, ako si nato dosiel. zadeklaruj si zasebou 2 premnne napr. typu char a pozri ako su organizovane v pamati.
Veď to je to, že nemôžem. Teda môžem. Asi rozchodím ten Turbo Debugger s nejakým skúšobným programom v Pascale. V Delphi ešte natoľko CPU window nepoznám, ale skúsim aj to. Teraz si ma doplietol. Chceš povedať, že smerníky ostanú nezmenené?
Moja teória padla.
zmeni sa obsah smernikov, ale ziadne presmerovanie.![]:)](https://static.poradna.net/images/smiley/evilsmile.gif)
//edit: tak si urob jednoduduchy program v pascale, zadefinuj si zasebou 2 premenne rovnakeho typu a pozri si to tam. urcite to bude rovnake.
Moje chyby:
1. To pvé som považoval za znak a druhé za reťazec. Reťazec som považoval vlastne za smerník na reťazec a znak som považoval za konkretny znak. Lenže ešte aj to som sa pomýlil a bral som to naopak a preto som si myslel, že za znakmi reťazca bude nasledovať smerník na znak (totiž som si to v tej rýchlosti pomýlil a presne naopak som to bral) a tesa som myslel, že sa bude prepisovať hodnota smerníka a tým pádom ten smerník ukáže na reťazec "A".
2. Potom som to skúšal tak, že som napísal surovo za heslo písmeno "A". Problém bol v tom, že som všetko urobil dobre, ale zabudol som na to, že v C má znak dĺžku dva bajty. Tak som potom konečne jeden znak pridal (konečne som sa zobudil).
Takže sa chcem poďakovať Igorovi, že toľko som nad tým špekuloval, že som sa opäť voľačo zaujímavé naučil.
1. ani jedno nie je smernik
Je to posunute kvoli tomu co som ti pisal uz hore: alignment
2. Znak (char) nema dlzku 2byty
Ale gratulujem
O to ide, nieco sa naucit 
1. To mi po čase došlo, lebo smerníky nemusia mať svoj obsah za sebou.
2. Aj toto mi došlo potom, ale niekde som tuším čítal, že nejakom C má znak dĺžku dva byte. Alebo to je tak, že za každým znakom je \0? Pretože inak by to prepísalo niečo v zásobníku a už by ten program nebežal.
/0 není za každým znakem, ale až na konci řetězce (null terminated string).
Msx. gratuluji

To byla ale blbost že?
Tak to bola blbosť. Sa mu ani nečudujem, že ho hackli.
Ozaj a čo je ten BFU?
V tom hinte islo o skratku "BOF" - Buffer OverFlow.
Po precitani toho clanku z www.root.cz (vdaka za odkaz MaSo) som na to prisiel i ja. Este by ma zaujimalo ci by sa toto iste stalo i v Delphi?
Pri použití String sa to nedá, pri použití ShortString sa by sa to malo dať pri vypnutí kontroly pretečenia zásobníka. Delphi nie je ako C, totiž Delphi všetko kontroluje a tým sa program nabaľuje. Aj preto je C bližšie k strojovému kódu a kto programuje v C by mal mať už aký-taký základ v inom jazyku, inak ho pochopenie C bude stáť veľa námahy.