반응형

 

Write-up 쓴 날짜 : 2022-09-16 19:55

 

RegisterMe.exe
0.00MB
RegisterMe.Oops.exe
0.00MB
RegisterMe.Oops_patched.exe
0.00MB

 

주제 - Basic nag removal + header problems 


RegisterMe

 

 

 

프로그램으 실행하면 위의 첫 번째 사진처럼 뜨고

"확인" 버튼을 누르면 위의 두 번째 사진처럼 뜨고

창을 닫으면 마지막 세 번째 사진처럼 뜬다.

 

등록하기 위해 nags를 없애라고 한다.


분석

 

 

EP 코드를 보니 프로그램을 실행했을 때 봤던 메시지 창의 내용들이 보인다.

 

근데 첫 번째 메시지 창의 내용과 세 번째 메시지 창의 내용은 보이는데 두 번째 메시지 창의 내용은 안보인다.

 

401002 주소에서 GetModuleHandle() 함수를 호출하는데 이 함수는 모듈(.dll 파일, .exe 파일 등)이 프로세스 주소 공간에 매핑되어 있다면, 해당 모듈의 핸들값을 반환한다.

인자로 모듈 대신 NULL 값(0)을 주면 자신을 호출한 프로그램의 핸들값을 반환하고, 실패 시 NULL 값을 반환한다.

// https://docs.microsoft.com/ko-kr/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea?redirectedfrom=MSDN

HMODULE GetModuleHandleA(
	[in, optional] LPCSTR lpModuleName
);

 

즉, EP 코드에서는 현재 인자로 0을 주기 때문에 RegisterMe 프로그램의 핸들값을 가져와 반환할 것이다.

만약 반환값이 0이면 401024 주소로 Jump 한다.

 

하지만 GetModuleHandle() 함수 호출 후 EAX에는 400000 값이 담겨있다.

 

그러므로 CMP 명령의 조건식이 성립할 수 없다는 것이다.

 

 

만약 GetModuleHandle() 함수의 반환값이 0이여서 점프한다면 401024 주소부터 스택에 인자를 넣고, 401034 주소에서 call 명령에 의해 Wait no longer:)) 창이 뜬다.

 

 

401024 주소의 인자들을 보면, 총 4개의 인자가 들어가는데 40311C에 있는 데이터, 0, 403120에 있는 데이터, A 이다.

 

40311C 주소에 있는 데이터
403120 주소에 있는 데이터

 

위의 사진을 보면 40311C 주소에 있는 데이터는 400000이다.

 

GetModuleHandle() 함수 호출 후 40311C 주소에 400000 값이 들어가게 되는데 그렇다면 401034 주소에서 호출하는 함수가 이 프로그램의 목적과 관련이 있고, 이 부분을 제외한 부분은 Nags라는 것이다.


풀이

 

 

40100F 주소에서 je 명령을 jmp로 바꾸고

(어셈블리어 명령어를 바꾸는 방법 말고 직접 hxd나 x64dbg와 같은 도구로 PE 헤더의 AddressOfEntryPoint 항목의 값을 바꿀 수도 있다.)

 

 

세 번째 메시지 창의 내용을 다 nop로 변경한다.

 

patched_RegisterMe.exe
0.00MB

 

그리고 개인적으로 메시지의 내용을 약간만 수정하여 파일 패치 후 저장한 뒤 실행하면 첫 번째 메시지 창과 세 번째 메시지 창은 안 뜨고 위의 사진과 같은 메시지 창만 뜬다.

 


RemoveMe.Oops

 

RegisterMe.Oops.exe
0.00MB

 


분석

 

 

RemoveMe.Oops 프로그램을 x32dbg로 열면 위와 같이 EP 코드로 잘 이동한다.

 

 

하지만 ollydbg에서 열면 위와 같이 나쁘거나 알 수 없는 32bit 파일의 포맷이라고 나온다.

 

 

실행하면 실행은 되지만 EP 코드로 이동하질 못한다.

 

 

HxD에 RemoveMe.Oops 파일을 로드해주고, 이 상태에서 

 

 

분석 -> 데이터 비교 -> 비교... -> 2. 파일 경로에 RemoveMe 파일 선택 -> 수평 정렬 -> 수락

 

 

그러면 위와 같이 두 파일을 비교할 수 있게 창이 뜬다.

 

그리고 어느 부분의 값이 다른지를 보여주는데 다음으로 다른 데이터로 이동할 때는 F6 키를 누르면 된다.

 


풀이

 

DF 주소에 있는 값이 다르다.

 

RemoveMe 파일에서는 00이지만, RemoveMe.Oops 파일에서는 40이다.

 

 

자체적으로 만든 pe explorer에서 RemoveMe 파일의 PE 헤더를 보면 DF 주소의 값은 SizeOfCode 항목의 값 중 일부분으로 00000400이다.

 

하지만 RemoveMe.Oops에서는 40000400이다.

 

 

위와 같이 RemoveMe.Oops에서 값 40을 00으로 바꾼다.

 

이런 식으로 F6 키를 이용해 다음 다른 데이터들로 이동한 후 RemoveMe 파일의 값과 동일하게 바꿔준다.


 

E3 주소의 SizeOfInitializedData 항목의 값도 00000A00으로 바꿔준다.

 

 

EF 주소의 BaseOfCode의 값도 00001000으로 바꿔준다.

 

 

F3 주소의 BaseOfData 값도 00002000으로 바꿔준다.

 

 

134h 주소의 NumberOfRvaAndSizes 값도 00000010으로 바꿔준다.

 

 

마지막으로 138h 주소의 EXPORT Directory 값도 0000000000000000으로 바꿔준다.

 

그리고 파일을 저장한다.


RegisterMe.Oops_patched.exe
0.00MB

 

 

수정된 RemoveMe.Oops 파일들 다시 Ollydbg에 로드하면 위와 같이 EP 코드 위치로 잘 이동될 것이다.

 


 

반응형

+ Recent posts