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
Igor přitvrdil, co? Už se těším na nějaký hint, ale i tak si myslím, že s tím nehnu
a bude uz len horsie.
Ten tvuj EXE poklada argument 24 hvezdicek a vys za spravne heslo
A zrúti sa pritom systém, čo?
Takže tak ho hackli. Vyriešené, odfajknuté, hotovo.
moj exe je specialne upraveny len pre testovanie, takze ...
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.
Ale aspon se ti povedlo to C a PHP sladit, aby se chovaly podobne
jj, zalezi od mnoha faktorov: platformy, kompilatora, ci je to v debug alebo release mode, atd.. takze vysledky su rozne.
btw., blahozelam.
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.
Takže toto je zrejme v poriadku:
Edit: A kde sa mi tento debugger vzal?
Neni nejaka debugovaci knihovna (odchytavani chyb) zahrnuta primo v tom EXE ?
A môžem sa ja čudovať, čo je taký dlhý.
To msx: ta hlaska je v poriadku, mozes ju brat ako dalsi hint (to myslim vazne ).
Nikde nie je napisane ze pri zadani nespravneho hesla program nespadne.
Princíp som už pochopil, len neviem ako to tam dostať.
pokial chapes princip, tak by to mala byt zalezitost max. 1 min. btw., ten exe nie je potrebny ku vyrieseniu hadanky, mal iba ulahcit testovanie spravnosti hesla.
Ja ho testujem cez hall of fame, takže ak zaznamenávaš všetky pokusy o správne heslo, tak sa na mne už asi hodnú chvíľu rehoceš.
nezaznamenavam to, ale rozmyslal som nad tym.
Ak si pochopil princip tak dalsi hint je: alignment
On ten svina 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
Á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ť.
Windows ani DOS s tym nema nic spolocne...
zkus se v tom kodu zamerit na radek
a deklarace prmennych
Mna osobne zaujimal len riadok co je nad nim
ptz. bez neho by to nebolo mozne takto hacknut...
Ms pravdu, bez toho radku by to neslo hacknout, ale ten radek pod tim mne jako prvni uderil do oci, pak jsem se podival na deklarace a ten radek, ktery uvadis...
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?
Viem teóriu, ale prakticky to neviem dokázať.
Tak to pak nevim, co vis.
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.
No, dejme tomu.
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.
//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
2. Znak (char) nema dlzku 2byty Je to posunute kvoli tomu co som ti pisal uz hore: alignment
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).
taky-vam-preteka
Nemenia sa ziadne smerniky, ptz. tam ani ziadne smerniky nie su.
char blablabla[15] je pole characterov, nie je v tom ziaden smernik a "blablabla" je len konstantna adresa ktoru pouziva prekladac, neda sa zmenit, ptz. nie je nikde ulozena.
Pekne HOF!
btw., a kde mas dvojicku máslo, akoze este nie je v HOF?
Asi je to slabsi kousek.
tak to vyzera. som zvedavy, co nato on.
Super! Odvolavam co jsem neodvolal.
Já jsem se zabýval programováním naposledy někdy v r. 1997. Postupně basic, pascal, asm, C, foxpro. Od té doby mi ale trochu toho programátorského fištrónu za ušima zůstalo
uz som .
pozeram, ze uz je vas celkom dost uspesnych riesitelov. rozmyslam, ze by som mohol nabuduce urobit aj viac komplexnu hadanku, kde bude pouzite viacero technik.
Msx. gratuluji To byla ale blbost že?
Taky gratuluji!
a ja gratujem vsetkym. uz chyba iba jednicka z minuleho kola Lrrr.
Tak to bola blbosť. Sa mu ani nečudujem, že ho hackli. Ozaj a čo je ten BFU?
BFU = Běžný Franta Uživatel.
este existuje aj horsi vyraz: Bloody Fucking User
Mě se nejvíc líbí Brain Free User
jj, to je tiez cool.
V tom hinte islo o skratku "BOF" - Buffer OverFlow.
Pekna hadanka na pretecenie zasobnika...
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.