Dziś zabawa dla saperów :) Jeśli należysz do tych szczęśliwców, którzy wiedzą, co powinno znaleźć się na białej poduszce, a do tego nie boisz się uruchomić WinDbg, to zapraszam do dalszej lektury i wspólnej zabawy.
Saper od środka
Bierzemy na ruszt systemowego sapera z Windows XP. Po zakończonej zwycięstwem rozgrywce możemy zrobić zrzut pamięci sapera (np. używając do tego celu procdumpa) i przyjrzeć się bliżej temu, co też w środku siedzi.
Zaczynamy od przeładowania symboli
0:000> .reload /f winmine.exe
0:000> lm
start end module name
01000000 01020000 winmine (pdb symbols) c:\websymbols\winmine.pdb\3B7D84751\winmine.pdb
5ad70000 5ada8000 uxtheme (deferred)
5cb70000 5cb96000 shimeng (deferred)
6f880000 6fa4a000 AcGenral (deferred)
769c0000 76a74000 userenv (deferred)
76b40000 76b6d000 winmm (deferred)
77120000 771ab000 oleaut32 (deferred)
773d0000 774d3000 comctl32 (deferred)
774e0000 7761d000 ole32 (deferred)
77be0000 77bf5000 msacm32 (deferred)
77c00000 77c08000 version (deferred)
77c10000 77c68000 msvcrt (deferred)
77dd0000 77e6b000 advapi32 (deferred)
77e70000 77f02000 rpcrt4 (deferred)
77f10000 77f59000 gdi32 (deferred)
77f60000 77fd6000 shlwapi (deferred)
77fe0000 77ff1000 secur32 (deferred)
7c800000 7c8f6000 kernel32 (deferred)
7c900000 7c9af000 ntdll (pdb symbols) c:\websymbols\ntdll.pdb\1751003260CA42598C0FB326585000ED2\ntdll.pdb
7c9c0000 7d1d7000 shell32 (deferred)
7e410000 7e4a1000 user32 (pdb symbols) c:\websymbols\user32.pdb\D18A41B74E7F458CAAAC1847E2D8BF022\user32.pdb
Wygląda na to, że wszystko mamy. Po kilku chwilach zabawy znajdujemy interesujące nas symbole
0:000> x winmine!*box*
010057a0 winmine!cBoxVisitMac = <no type information>
010010b8 winmine!_imp__MessageBoxW = <no type information>
01003084 winmine!StepBox (<no parameter info>)
010057a4 winmine!cBoxVisit = <no type information>
01005338 winmine!yBoxMac = <no type information>
010031a0 winmine!PopBoxUp (<no parameter info>)
01001120 winmine!_imp__DialogBoxParamW = <no type information>
01005334 winmine!xBoxMac = <no type information>
0100316b winmine!PushBoxDown (<no parameter info>)
0:000> x winmine!*bomb*
01002f3b winmine!CountBombs (<no parameter info>)
01002801 winmine!DisplayBombCount (<no parameter info>)
01002f80 winmine!ShowBombs (<no parameter info>)
01002785 winmine!DrawBombCount (<no parameter info>)
01005194 winmine!cBombLeft = <no type information>
0100346a winmine!UpdateBombCount (<no parameter info>)
01005330 winmine!cBombStart = <no type information>
0:000> x winmine!*rgb*
01005340 winmine!rgBlk = <no type information>
0:000> dd winmine!cBombStart L1
01005330 0000000a
0:000> dd winmine!xBoxMac L1
01005334 00000009
0:000> dd winmine!yBoxMac L1
01005338 00000009
A zatem mamy 10 bomb umieszczonych na planszy 9 x 9. Zróbmy zatem jeszcze zrzut zawartości samej planszy (zrzut powyżej). Dla czytelności część wydruku wyciąłem.
0:000> db /c 20 winmine!rgBlk L160
01005340 10 10 10 10 10 10 10 10-10 10 10 0f
01005360 10 40 41 8e 42 8e 42 8e-41 40 10 0f
01005380 10 40 41 41 42 41 43 42-42 40 10 0f
010053a0 10 41 41 40 40 41 42 8e-41 40 10 0f
010053c0 10 8e 41 40 40 41 8e 42-41 40 10 0f
010053e0 10 42 43 41 41 41 41 41-40 40 10 0f
01005400 10 8e 42 8e 41 40 41 41-41 40 10 0f
01005420 10 42 43 41 41 40 41 8e-41 40 10 0f
01005440 10 8e 41 40 40 40 41 41-41 40 10 0f
01005460 10 41 41 40 40 40 40 40-40 40 10 0f
01005480 10 10 10 10 10 10 10 10-10 10 10 0f
Wynik możemy zapisać jako ciąg {x[i]y[i]}, gdzie x[i] - numer wiersza, y[i] - kolumny, licząc od lewego górnego rogu i zaczynając numerację od '1'. Powyższą rozgrywkę możemy zapisać jako
{13,15,17,37,41,46,61,63,77,81}
a w postaci stringu jako
"13151737414661637781"
Rozbroisz mnie?
Skoro wszystko już jest jasne, to czy znajdzie się jakiś saper, który rozbroi zaminowane pole? Zrobiłem zrzut pamięci, który można ściągnąć stąd, reszta w waszych rękach :) Jako wynik podajcie iloczyn (lub sumę - do wyboru) wszystkich składowych + położenie jednej miny.
I jeszcze na sam koniec. Chodzi mi po głowie przygotowanie złożonej zagadki typu DebugMe (nawiązując do nazwy CrackMe), ale czy byliby jacyś chętni do jej rozwiązania? Jeśli tak, to proszę ujawnijcie się w komentarzach, a poświęcę trochę czasu i coś przygotuję.
(Ilustracja użyta na początku tekstu - autor nieznany, plik ściągnięty z udostępnionych przez Justynę Spychałę na FB).