Copy Link
Add to Bookmark
Report

3x07 Full Reverse (Target Inline patching nSPack 2.x)

eZine's profile picture
Published in 
phearless
 · 11 months ago

             [ Target: Inline patching nSPack 2.x ] 

pH#3 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Tools of trade ]
0x03 ................................................ [ Inline Patch ]
0x04 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[ Intro ]

Do sada ste sigurno naucili kako se inlineuje UPX, ali sta ako se
susretnemo sa packerom koji nije toliko jednostavan za inline
patchovanje...

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

Da bi smo "popravili" ovaj crackme, trebace nam neki "vaspitni" alati:

[+] OllyDBG v.1.10 ............................... http://www.ollydbg.de

i naravno meta:

[+] crackme.nSPacked.exe ................................ my.target4.zip

Svi ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate, podhitno ih nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!

--[ 0x03 ]---------------------------------------------[ Inline Patch ]

Kao i do sada prvo moramo da pronadjemo pogodno mesto za ubacivanje
naseg inline patcha. Ovo prakticno znaci da moramo da pronadjemo packer
exit point i da ga preusmerimo na nas patch kod. Na packer OEPu imamo
sledeci kod:

0040101B > $- E9 87660000 JMP crackme_.004076A7
00401020 B4 DB B4
00401021 09 DB 09

koji cemo ispratiti klikom na F8, posle cega cemo se naci ovde:

004076A7 9C PUSHFD
004076A8 60 PUSHAD
004076A9 E8 00000000 CALL crackme_.004076AE

Ovde cemo primeniti STACK trik tako sto cemo kliknuti 2x F8, posle cega
cemo postaviti Hardware break-point on dword acces na lokaciju ESPa u
memory dumpu. Klikom na F9 dolazimo do sledece lokacije:

0040791F 61 POPAD
00407920 9D POPFD
00407921 - E9 9A99FFFF JMP crackme_.004012C0

JMP skok na adresi ocigledno vodi ka OEPu i mozemo ga preusmeriti ka
nasem patch kodu. Naravno moramo prvo da odredimo mesto u fajlu koje je
dovoljno veliko da sadrzi nas patch. Najcesce se mesto za inline patch
trazi u PE Headeru fajla odnosno od adrese 00400300. Mi cemo pritisnuti
CTRL+G u Ollyju i oticicemo na adresu 00400333 na kojoj se trenutno
nalazi dovoljno praznog mesta za ubacivanje naseg patcha. Naravno ovo
mesto i nije bas totalno prazno ali ovaj kod se odnosi na glavnu .exe
ikonu tako da nema veze da li ce nas patch kod biti ovde ili ne.
Ubacicemo sledeci kod:

00400333 C605 35104000 F> MOV BYTE PTR DS:[401035],0FF
0040033A C605 8A104000 0> MOV BYTE PTR DS:[40108A],0
00400341 68 C0124000 PUSH inline_n.004012C0
00400346 C3 RET

Ovo je veoma jednostavan patch kod koji patchuje bajtove na adresama
00401035 i 0040108A, posle cega se skace na OEP pomocu komandi PUSH i
RET. Kada snimimo ove promene i restartujemo Olly mozemo i da izmenimo
skok na adresi 00407921 tako da on pokazuje na patch kod, odnosno
izmenicemo ga u ovo:

00407920 9D POPFD
00407921 - E9 0D8AFFFF JMP inline_n.00400333

Konacno mozemo da snimimo sve promene i pokusamo da startujemo patchovan
fajl, ali ... kao sto vidimo negde smo pogresili jer se program nije
startovao kao sto je trebalo, cak naprotiv on se "srusio". Da li smo
nesto zaboravili? Pogledajmo za trenutak spisak importa koji se nalaze u
pakovanom .exe fajlu. Ako odemo u prozor executable modules videcemo ovo:

Names in crackme_
Address Section Type ( Name Comment
004075BC nsp1 Import ( KERNEL32.VirtualAlloc
004075C0 nsp1 Import ( KERNEL32.VirtualFree
004075B8 nsp1 Import ( KERNEL32.VirtualProtect

Par importa zaduzenih za alociranje, zastitu i oslobadjanje memorije.
Zastitu memorije? Da, VirtualProtect se koristi da bi se nekoj memoriskoj
alokaciji dodelio status: Full Access, Read/Write, Read only,a Posto se
nas inline patch rusi pri pokusaju da upise nas patch u glavnu sekciju
zakljucujemo da je glavna sekcija zakljucana za pisanje od strane
VirtualProtecta. Ovo bi trebalo da bude lako iz razloga sto se
VirtualProtect vec nalazi u import tablici, odnosno ne ucitava se
dinamicki. Logicno je da prvo sto nam pada na pamet je postavljanje
break-pointa na taj import, ali to nije pravo resenje, pogotovo ne kada
se radi o pakerima. Posto Olly nece zastati prilikom postavljanja
break-pointa, moramo da primenimo sledeci trik.
Naime posto se import vec nalazi u fajlu ocigledno je da program nema
razloga za dinamickim ucitavanjem importa, odnosno packer mora prilikom
pozivanje VirtualProtecta pristupiti adresi na kojoj se on nalazi. Ako
pogledamo nasu tablicu importa videcemo da se VirtualProtect nalazi na
adresi 004075B8 zbog cega bi bilo najbolje da postavimo jedan break-point
na tu adresu. Odnosno necemo postaviti obican break-point na toj adresi,
nego cemo otici na tu adresu u Hex dumpu kako bi smo postavili memoriski
break-point on access. Zasto ovo radimo? Pa ako pogledate hex dump:

004075B8 >9E 16 E6 77 72 AC E7 77 ...wr..w
004075C0 >CB 15 E8 77 FD 98 E7 77 ...w...w

videcete da je DWORD na adresi 004075B8 ustvari pointer ka adresi
77E6169E, koja je sigurno lokacija APIja u kernel32.dll fajlu. Posle
postavljanja memoriskog break-pointa na adresu 004075B8 i klika na F9:

004078F5 74 28 JE SHORT crackme_.0040791F
004078F7 43 INC EBX
004078F8 8DB5 6DFEFFFF LEA ESI,DWORD PTR SS:[EBP-193]
004078FE 8B16 MOV EDX,DWORD PTR DS:[ESI]
00407900 56 PUSH ESI
00407901 51 PUSH ECX
00407902 53 PUSH EBX
00407903 52 PUSH EDX
00407904 56 PUSH ESI
00407905 FF33 PUSH DWORD PTR DS:[EBX]
00407907 FF73 04 PUSH DWORD PTR DS:[EBX+4]
0040790A 8B43 08 MOV EAX,DWORD PTR DS:[EBX+8]
0040790D 03C2 ADD EAX,EDX
0040790F 50 PUSH EAX
00407910 FF95 11FFFFFF CALL NEAR DWORD PTR SS:[EBP-EF] ; kernel32.VirtualProtect
00407916 5A POP EDX
00407917 5B POP EBX
00407918 59 POP ECX
00407919 5E POP ESI
0040791A 83C3 0C ADD EBX,0C
0040791D ^ E2 E1 LOOPD SHORT crackme_.00407900
0040791F 61 POPAD
00407920 9D POPFD
00407921 - E9 9A99FFFF JMP crackme_.004012C0 <- Jmp to OEP

nalazimo se na adresi 00407910. Ako analiziramo sve parametre
VirtualProtect funkcije videcemo da se ona ponavlja i primenjuje na svaku
sekciju odpakovanog fajla. Takodje primecujemo da je ovo poslednja
operacija koju nSPack izvrsava pre skoka na OEP, odnosno na nas patch
kod. Ovde imamo par mogucih resenja, ali posto je cilj inline patch da
smanji velicinu samog patch mi cemo pronaci najjednostavnije resenje. To
jest pogledacemo skok na adresi 004078F5 i videcemo da kada se on izvrsi,
ne izvrsava se VirtualProtect zastita. Dakle jednostavnom promenom skoka
JNZ u JMP, VirtualProtect se ne izvrsava i nas inline patch radi. Imajte
na umu da je VirtualProtect cesto koriscena API funkcija i da bi trebalo
da obratite paznju na nju prilikom pravljenja inline patcheva.

--[ 0x04 ]---------------------------------------------[ Outro & Greetz ]

Konacan rezultat patchovanja mozete videti u fajlu inline.nSPacked.exe

Greetz:

SeekNDestroy | TSRh | EMiNENCE | CoolPHat | ELUSIVE
b4d_s3c70r | B0r0 | loco | Kostolomac | Virus Krew | Jezgra | BlackHat

--[ EOF ]----------------------------------------------[ made by Ap0x ]

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT