반응형
반응형

 

Write-up 쓴 날짜 : 2022-10-13 15:48

 

DVDMenuStudio.exe
3.43MB
patched_DVDMenuStudio.exe
3.43MB


주제 - More difficult schemes and an introduction to inline patching

인라인 패치 : 프로램이 실행될 때마다 별도의 패치 코드를 실행해 매번 프로세스 메모리의 코드를 패치한다.

Code Injection과 Inline Patch는 다르다.

code injection은 시행 중인 컴퓨터 프로세스에 임의의 코드를 도입하는 기술이다.
이 기술은 로컬 또는 인터넷을 통해 원격으로 수행할 수 있다.

 

Inline patch는 프로그래머가 프로그램의 가능성을 향상, 확장, 차단 등을 위해 디스크에 있는 프로그램의 코드를 변경하는 기술이다.
이 기술은 소프트웨어가 패킹됐을 때 자주 사용한다.


분석 1

 


프로그램을 실행하면 위와 같이 나온다.

30일 남았다고 뜬다.



Name 항목에만 입력한 후 OK 버튼을 누르면 위와 같이 뜨고


Serial 값을 7글자만 쓰면 위와 같이 "Please check Serial Number..." 메시지가 뜨고


Serial 값을 8자리 입력하면 위와 같이 메시지 창이 뜬다.


위와 같이 입력하면 Please check Serial Number...가 뜬다.



Hints
1. 이 프로그램은 30일이 지난 후 만료되었을 때 그 만료되었다는 사실을 유지한다.
즉, 레지스트리나 어떠한 파일 또는 다른 무언가에 만료되었었다는 사실을 저장해두는 것이다.
2. 위의 30 남았다는 제한과 같이 시간 제한이 걸려있는 프로그램은 KillTimer API를 사용한다.


분석 2

 


x32 dbg에서 The registration code를 입력하면 위와 같이 한 개의 문자열이 뜬다.


해당 문자열은 4DC1B1 주소에서 참조한다.


스크롤을 쭉 올리면 4DBBD0 주소에서 해당 문자열을 출력하는 부분이 포함된 어떠한 루틴이 시작한다.


3과 비교 후 3이 아니면 4DC1C0 주소로 점프하여 4와 비교한 후 killTimer() 함수 호출 후 "Thank you for your support!\nPlease Exit the Software and start it again to validate the code." 메시지를 띄운다.

그렇다면 eax의 값이 4이어야 한다.


3과 비교하는 4DC19D 주소로 점프하는 조건 분기는 4DC04C 주소에 있다.


2와 비교하는 4DC049 주소로 점프하는 조건 분기는 4DBE01 주소에 있다.


4DBDFE 주소로 점프하는 조건 분기는 4DBDA9 주소에 있다.

그리고 4DBDA4 주소에서 처음으로 eax와 1을 비교하는데, eax는 4DBD9E 주소에서 세팅된다.


4DBD9E 주소에 BP를 걸고 Ctrl + F2 키를 눌러 재실행 한 후 F9 키를 눌러 진행한다.


4DBD9E 주소의 명령을 실행하기 전 EAX 레지스터의 값은 19FC4C이다.


4DBD9E 주소의 명령이 실행된 후 eax에 1이 담기고 F9 키를 누르면 EAX에 2가 담긴다.

그리고 한 번 더 F9 키를 누르면


위의 창이 뜨고


Enter Reg. Code를 눌러 위와 같이 입력한 뒤 OK 버튼을 누른다.


그러면 EAX에 3이 저장되고, "The registration code seems to be not valid.\nPlease check if you didn't made any mistake." 메시지 창이 뜬다.


그렇다면 4DBD9E 주소의 명령을 mov eax, 4로 바꾸면 된다.



하지만 위와 같이 바꾸려고 하면 2byte가 더 커서 다음 명령어인 push ebx와 push esi 명령어를 덮어쓰게 된다.

그렇다면 인라인 패치를 통해 메모리의 빈 공간에 패치할 코드를 적어두고 해당 패치 코드가 있는 빈 메모리 공간으로 점프하게 만들어 패치 코드를 실행 후 다시 돌아와 정상적으로 동작을 이어가도록 해주면 된다.

패치 코드가 있는 곳을 code cave라고 하는데, 순서는 루틴 -> Code Cave -> 루틴 이다.

참고)
조건 분기문인 점프문은 점프하는 거리에 따라 점프를 나눌 수 있고, 짧은 점프와 멀리 뛰는 점프 두 가지 범주로 나뉜다.
이 두개의 차이점은 짧은 점프는 opcode에서 2byte만 차지하지만, 80byte만 점프할 수 있고
이 이상의 모든 점프는 opcode에서 5byte를 사용하는 멀리 뛰는 점프이다.


code cave로 점프하기 위해 jmp를 쓰면 opcode에서 5byte가 차지되므로 위의 4DBDA1 주소와 4DBDA2 주소의 명령어가 덮어씌워진다.

그러므로 위의 두 명령을 복사한다.

그리고 위의 두 명령어 다음 주소인 4DBDA3 주소는 Code Cave의 코드가 수행된 후 점프할 주소이므로 기억해둬야 한다.


풀이 1

 


메모리에서 빈 공간인 5E47D4 주소로 이동한다.


위와 같이 내용을 기재한 후


4DBD9E 주소의 명령어를 5E47D4 주소로 점프하도록 수정한다.


그리고 F8 키를 눌러 진행하다보면 4DC1D9 주소에서 4DBD80 주소로 점프한다.

그렇다면 eax의 값이 4가 아니라는 것이다.


이전에 eax와 1, 7, 2, 3, 4, 5, 6, A, B를 비교하는데 모든 조건 분기를 다 통과하면 마지막에 B와 비교한다.

그렇다면 위와 같이 5E47D4 주소의 명령어도 mov eax, B로 바꿔준다.

인라인 패치 내용을 저장하고 패치된 파일을 실행하면 등록이 성공적으로 된다.


풀이 2

 

EP 코드에서 F9 키를 눌러 실행한다.

 

 

 

그럼 위와 같이 창이 뜨게 되고, 이 창을 띄워둔 상태에서 Ollydbg로 돌아간다.

 

 

Ollydbg에서 F12 키를 누르면 위와 같이 retn 10 명령어에서 멈추게 된다.

 

 

그 상태에서 위의 애매랄드 색 아이콘들 중 K 아이콘을 누르면 콜 스택을 볼 수 있는데

 

콜 스택은 가장 위에 있는 것이 마지막에 실행됐던 것이다.

 

NAG 메세지를 띄울 때의 인자들이 보이지만 어디서 Nag를 생성하는지 찾아야 한다.

 

가장 아래에 있는 19FA6C 주소의 명령어를 보면 4DC0D1 주소에서 5ABE4D 주소를 호출한다.

 

 

4DC0D1 주소를 더블 클릭하여 이동하면 위와 같이 나오는데, 해당 주소에 BP를 걸고 스크롤을 쭉 위로 올려본다.

 

 

그럼 위와 같이 4DBD80 주소에서 함수 프롤로그가 보인다.

 

해당 주소에 BP를 걸고 Ctrl + F2 키를 눌러 재실행 한 후 F9 키를 눌러 실행한다.

 

 

그러면 위와 같이 4DBD80 주소에서 멈추게 된다.

 

4DBDB0 주소에서 KillTimer 함수를 호출하는데

https://learn.microsoft.com/ko-kr/windows/win32/api/winuser/nf-winuser-killtimer

 

 

 

F8 키를 눌러 Killtimer 함수 호출 직전까지 이동 후 스택을 보면 TimerID는 1이고, hwnd는 DVD Menu Studio - [Untitled] 무누가 있는 창이다.

 

 

그리고 4DBDBE 주소에서 1과 비교하는데 현재 [EAX+164] = [66298C] = 00000000이기 때문에 Zero flag가 설정되지 않으므로 4DBDE6 주소로 점프한다.

 

4DBDDB 주소와 4DBDF3 주소에서 SetTimer() 함수를 호출하는데 다른 점은 설정하는 시간이  200과 500으로 다른다.

 

 

4DBDBE 주소의 명령어를 실행하고, ZF 플래그의 값을 1로 수정한 뒤 F9를 눌러 실행하면

 

 

이전에 보았던 30days 창이 뜨지 않는다.

 

 

Ctrl + F2 키를 눌러 재실행 후 F9 키를 누른 뒤 위의 부분의 값을

 

 

위와 같이 바꿔준다.

 

cmp 명령에서 1과 비교했는데 이후에 어떠한 명령에서 EAX+164 주소에 있는 값을 참조할 지 모르므로 EAX+164를 1로 만들어준다.

 

그리고 패치된 내용을 저장 후 저장된 패치 파일을 실행하면 30days가 뜨지 않고 실행된다.

 

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 16. Urlegal, movgear  (0) 2022.11.02
[Lenatuts4you] 15. ReverseMe(Inline patch)  (0) 2022.11.02
[Lenatuts4you] 13. XoftSpy  (0) 2022.11.02
[Lenatuts4you] 12. Teksched  (0) 2022.11.02
[Lenatuts4you] 11. fjprodsetup  (0) 2022.11.02

+ Recent posts