07.02.2015 Views

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

00407032 + 1. Ponovo cemo restartovati Olly i ponovo cemo podesiti<br />

memorijske break-pointe na vec objasnjen nacin. Kada dodjemo do zadnje<br />

REP komande primeticemo da se adresa 00407033 prepisuje sa sadrzajem:<br />

ECX=0000000C (decimal 12.)<br />

DS:[ESI]=[009B0396]=68 ('h')<br />

ES:[EDI]=[00407032]=C4<br />

privremene adrese 009B0396 (ovo ce biti drugacije svaki put i za svaki<br />

kompjuter). Problem sa ovim nasim otkricem je da znamo sa koje se adrese<br />

upisuje PUSH OEP - 1 komanda ali ne znamo kako ce ta adresa izgledati jer<br />

se adresa sa koje se upisuje PUSH menja svaki put. Ali posle vise startovanja<br />

nase mete u pokusaju da pronadjemo zavisnost izmedju 009B0396 i<br />

00407033 dolazimo do ovoga:<br />

ECX=0000000C (decimal 12.)<br />

DS:[ESI]=[00A10396]=68 ('h')<br />

ES:[EDI]=[0045D032]=C4<br />

Kao sto se vidi PUSH OEP - 1 se uvek upisuje sa VirualAlloca + 396 adrese.<br />

Ovo nam je pomoglo i sada mozemo da ubacimo nas patch kod na adresu<br />

00400333. Prvo cemo ubaciti kod koji smo ukrali na racun skoka ka<br />

00400333 adresi:<br />

00400333 56 PUSH ESI<br />

00400334 8BF7 MOV ESI,EDI<br />

00400336 2BF0 SUB ESI,EAX<br />

a posle ovoga moramo da uradimo kod koji ce racunati VirtualAlloc + 396 +<br />

0x400 (jer je ovo odredjena velicina kao safe za pisanje). Posto su EDI i ESI<br />

registri isti iskoristicemo jedan od njih da ga privremeno zamenimo EAXom i<br />

da na EAXu izracunamo novu adresu koja je potrebna da postoji u memoriji<br />

da bismo mi mogli da izvrsimo pisanje redirekcije OEPa. Ovo izgleda ovako:<br />

00400338 97 XCHG EAX,EDI<br />

00400339 66:33C0 XOR AX,AX<br />

0040033C 05 96080000 ADD EAX,896<br />

00400341 3BF0 CMP ESI,EAX // Da li EAX adresa postoji<br />

00400343 7F 0B JG SHORT patch.00400350<br />

00400345 97 XCHG EAX,EDI // Ako ne postoji<br />

00400346 8BFE MOV EDI,ESI // samo se vrati iz patcha<br />

00400348 03F8 ADD EDI,EAX // vracajuci registre u<br />

0040034A 68 D1724000 PUSH patch.004072D1 // prethodno stanje<br />

0040034F C3 RET<br />

00400350 C780 01FBFFFF 5> MOV DWORD PTR DS:[EAX-4FF],0040035B // Patch lokacija<br />

0040035A ^ EB E9 JMP SHORT patch.00400345 // Vrati se iz patcha<br />

I naravno posle ubacivanja adrese - 1 na kojoj se nalazi nas patch kod<br />

potrebno je vratiti sve registre u prethodno stanje kako PeX ne bi pravio<br />

nikakve greske. Posto smo vec definisali da se novi patch kod nalazi na<br />

adresi 0040035B + 1 potrebno je samo da ga ubacimo:<br />

0040035C<br />

C605 35104000 F>MOV BYTE PTR DS:[401035],0FF // Patch kod<br />

00400363 C605 8A104000 0>MOV BYTE PTR DS:[40108A],0 // Patch kod<br />

0040036A 68 C0124000 PUSH patch.004012C0 // OEP lokacija<br />

0040036F C3 RET // JMP to OEP<br />

I to je to. Uspesno smo patchovali PeXovan program bez obzira na to sto se<br />

u PeXu OEP “prepisuje” sa dinamicki alocirane adrese. Ovo jeste bilo malo<br />

teze uraditi ali smo dosta toga naucili o inlineingu zahvaljujuci bartu iz xt-a<br />

koji je autor PeXa i FSGa.<br />

<strong>The</strong> <strong>Art</strong> <strong>of</strong> <strong>Reversing</strong> <strong>by</strong> <strong>Ap0x</strong> Page 264 <strong>of</strong> 293

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!