Po drátě 6: Řešení úlohy č. 12

Archiv se zadáním této úlohy obsahuje tři soubory: céčkový zdroják, binárku a coredump. To vypadá, že nastal čas oprášit gdb...

Céčkový zdroják předstírá, že kontroluje bezpečnost hesla zadaného na vstupu, ve skutečnosti ale nedělá nic moc zajímavého. A ještě to dělá špatně. Nejprve na heslo pustí několik více či méně duchaplných testů (nejabsurdnější je numerologický test, který nikdy nevrací 13, protože počítá zbytky po dělení devíti) a pokud jimi heslo projde, spočítá hash hesla. Přesněji řečeno, spočítal by, kdyby to prase, co napsalo program, nelezlo k charům přes pointer na uint32_t a ještě s nimi nezacházelo, jako kdyby oba ty typy byly stejně velké. Takhle program jenom spadne a před tím ještě, to je ale smůla, přepíše celý stack.

To, co jsme dostali do ruky, je pokus nějakého orga otestovat bezpečnost hesla ke dvanácté úloze. Zadal heslo na vstup a bááác... po hesle zbyl jenom coredump. Protože je celý stack včetně toho vstupu v háji, nezbývá, než si jej spočítat z toho, co máme k dispozici.

Nejjednoduší způsob, jak na to, je nejspíš následující: Pustíme si na coredump gdb, vypíšeme si hodnotu, která je uložená v první položce pole buf. Potom si vypíšeme hodnotu i, která momentálně ukazuje o jednu položku dál, než kam se nám naposledy podařilo zapsat. Následně si hodnotu první položky vyhledáme v coredumpu. Známe začátek a délku, máme tedy k dispozici data, která jsou nyní uložená v poli. Potom už není nic lehčího, než podívat se do zdrojáku a podle něj vrátit obsah pole do původního stavu. Najdeme tam heslo crackonos.

Úlohu vyrobila Anička.